From 0770db04507975fc85530fbf86bbc721def20413 Mon Sep 17 00:00:00 2001
From: unknown <holyfoot@deer.(none)>
Date: Mon, 3 Jul 2006 14:54:09 +0500
Subject: [PATCH 01/19] bug 20317 (test fails in embedded for different number
 of threads is running)

I decided to make ps_1general test independent from actual number of
threads running


mysql-test/r/ps_1general.result:
  result fixed
mysql-test/t/ps_1general.test:
  as i think we don't really care about the number of threads running
  i just replace the number with '#'
---
 mysql-test/r/ps_1general.result | 2 +-
 mysql-test/t/ps_1general.test   | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result
index 49e858eca56..67b6c0d1b0b 100644
--- a/mysql-test/r/ps_1general.result
+++ b/mysql-test/r/ps_1general.result
@@ -282,7 +282,7 @@ t9	MyISAM	9	Dynamic	2	220	440	4294967295	2048	0	NULL	#	#	#	latin1_swedish_ci	NUL
 prepare stmt4 from ' show status like ''Threads_running'' ';
 execute stmt4;
 Variable_name	Value
-Threads_running	1
+Threads_running	#
 prepare stmt4 from ' show variables like ''sql_mode'' ';
 execute stmt4;
 Variable_name	Value
diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test
index 5752e6b0b66..6f15ba8f673 100644
--- a/mysql-test/t/ps_1general.test
+++ b/mysql-test/t/ps_1general.test
@@ -305,6 +305,7 @@ prepare stmt4 from ' show table status from test like ''t9%'' ';
 --replace_result 2147483647 4294967295
 # Bug#4288
 execute stmt4;
+--replace_column 2 #
 prepare stmt4 from ' show status like ''Threads_running'' ';
 execute stmt4;
 prepare stmt4 from ' show variables like ''sql_mode'' ';

From ca78b386d6991efa3a5281d6b2b1fa692bf3a847 Mon Sep 17 00:00:00 2001
From: unknown <acurtis/antony@xiphis.org/ltantony.xiphis.org>
Date: Thu, 20 Jul 2006 12:54:01 -0700
Subject: [PATCH 02/19] Bug#19939   AUTHORS and CONTRIBUTORS are not reserved
 keywords.

mysql-test/r/keywords.result:
  Bug#19939
    Test for bug
mysql-test/t/keywords.test:
  Bug#19939
    Test for bug
---
 mysql-test/r/keywords.result | 16 ++++++++++++++++
 mysql-test/t/keywords.test   | 24 ++++++++++++++++++++++++
 sql/sql_yacc.yy              |  3 ++-
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/keywords.result b/mysql-test/r/keywords.result
index 88a0ab8abd5..597983dab7e 100644
--- a/mysql-test/r/keywords.result
+++ b/mysql-test/r/keywords.result
@@ -16,3 +16,19 @@ select events.binlog from events;
 binlog
 1
 drop table events;
+create procedure p1()
+begin
+declare n int default 2;
+authors: while n > 0 do
+set n = n -1;
+end while authors;
+end|
+create procedure p2()
+begin
+declare n int default 2;
+contributors: while n > 0 do
+set n = n -1;
+end while contributors;
+end|
+drop procedure p1;
+drop procedure p2;
diff --git a/mysql-test/t/keywords.test b/mysql-test/t/keywords.test
index de0159a950e..1af4a1354be 100644
--- a/mysql-test/t/keywords.test
+++ b/mysql-test/t/keywords.test
@@ -19,3 +19,27 @@ select events.binlog from events;
 drop table events;
 
 # End of 4.1 tests
+
+#
+# Bug#19939 "AUTHORS is not a keyword"
+#
+delimiter |;
+create procedure p1()
+begin
+   declare n int default 2;
+   authors: while n > 0 do
+     set n = n -1;
+   end while authors;
+end|
+create procedure p2()
+begin
+   declare n int default 2;
+   contributors: while n > 0 do
+     set n = n -1;
+   end while contributors;
+end|
+delimiter ;|
+drop procedure p1;
+drop procedure p2;
+
+# End of 5.1 tests
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index e345b61e41e..d957f94a43d 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9339,7 +9339,6 @@ user:
 keyword:
 	keyword_sp		{}
 	| ASCII_SYM		{}
-	| AUTHORS_SYM		{}
 	| BACKUP_SYM		{}
 	| BEGIN_SYM		{}
 	| BYTE_SYM		{}
@@ -9397,6 +9396,7 @@ keyword_sp:
 	| ALGORITHM_SYM		{}
 	| ANY_SYM		{}
 	| AT_SYM                {}
+	| AUTHORS_SYM		{}
 	| AUTO_INC		{}
 	| AUTOEXTEND_SIZE_SYM   {}
 	| AVG_ROW_LENGTH	{}
@@ -9422,6 +9422,7 @@ keyword_sp:
 	| COMPRESSED_SYM	{}
 	| CONCURRENT		{}
 	| CONSISTENT_SYM	{}
+	| CONTRIBUTORS_SYM	{}
 	| CUBE_SYM		{}
 	| DATA_SYM		{}
 	| DATAFILE_SYM          {}

From a611fbf171ed7d38b3d69d2a6408b7c751f3342e Mon Sep 17 00:00:00 2001
From: unknown <ingo/mydev@chilla.local>
Date: Fri, 21 Jul 2006 12:22:41 +0200
Subject: [PATCH 03/19] Bug#20719 - Reading dynamic records with write buffer
 could fail

Fixed a possible problem with reading of dynamic records
when a write cache is active. The cache must be flushed
whenever a part of the file in the write cache is to be
read.

Added a read optimization to _mi_read_dynamic_record().

No test case. This was a hypothetical but existing problem.


myisam/mi_dynrec.c:
  Bug#20719 - Reading dynamic records with write buffer could fail

  Fixed a possible problem with reading of dynamic records
  when a write cache is active. The cache must be flushed
  whenever a part of the file in the write cache is to be
  read. This must be done before the read of the header
  and before the read of the rest block.

  Renamed the 'flag' and 'skipp_deleted_blocks' variables.

  Added a read optimization to _mi_read_dynamic_record()
  that was present in _mi_read_rnd_dynamic_record() already.
  After _mi_get_block_info() we have some bytes of the record
  in the header buffer already. No need to read them again.
---
 myisam/mi_dynrec.c | 157 +++++++++++++++++++++++++++++++++++++--------
 1 file changed, 129 insertions(+), 28 deletions(-)

diff --git a/myisam/mi_dynrec.c b/myisam/mi_dynrec.c
index 0ffab05b6bc..c4865315283 100644
--- a/myisam/mi_dynrec.c
+++ b/myisam/mi_dynrec.c
@@ -1095,12 +1095,41 @@ void _my_store_blob_length(byte *pos,uint pack_length,uint length)
 }
 
 
-	/* Read record from datafile */
-	/* Returns 0 if ok, -1 if error */
+/*
+  Read record from datafile.
+
+  SYNOPSIS
+    _mi_read_dynamic_record()
+      info                      MI_INFO pointer to table.
+      filepos                   From where to read the record.
+      buf                       Destination for record.
+
+  NOTE
+
+    If a write buffer is active, it needs to be flushed if its contents
+    intersects with the record to read. We always check if the position
+    of the first byte of the write buffer is lower than the position
+    past the last byte to read. In theory this is also true if the write
+    buffer is completely below the read segment. That is, if there is no
+    intersection. But this case is unusual. We flush anyway. Only if the
+    first byte in the write buffer is above the last byte to read, we do
+    not flush.
+
+    A dynamic record may need several reads. So this check must be done
+    before every read. Reading a dynamic record starts with reading the
+    block header. If the record does not fit into the free space of the
+    header, the block may be longer than the header. In this case a
+    second read is necessary. These one or two reads repeat for every
+    part of the record.
+
+  RETURN
+    0           OK
+    -1          Error
+*/
 
 int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
 {
-  int flag;
+  int block_of_record;
   uint b_type,left_length;
   byte *to;
   MI_BLOCK_INFO block_info;
@@ -1112,17 +1141,16 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
     LINT_INIT(to);
     LINT_INIT(left_length);
     file=info->dfile;
-    block_info.next_filepos=filepos;	/* for easyer loop */
-    flag=block_info.second_read=0;
+    block_of_record= 0;   /* First block of record is numbered as zero. */
+    block_info.second_read= 0;
     do
     {
       if (info->opt_flag & WRITE_CACHE_USED &&
-	  info->rec_cache.pos_in_file <= block_info.next_filepos &&
+	  info->rec_cache.pos_in_file < filepos + MI_BLOCK_INFO_HEADER_LENGTH &&
 	  flush_io_cache(&info->rec_cache))
 	goto err;
       info->rec_cache.seek_not_done=1;
-      if ((b_type=_mi_get_block_info(&block_info,file,
-				     block_info.next_filepos))
+      if ((b_type= _mi_get_block_info(&block_info, file, filepos))
 	  & (BLOCK_DELETED | BLOCK_ERROR | BLOCK_SYNC_ERROR |
 	     BLOCK_FATAL_ERROR))
       {
@@ -1130,9 +1158,8 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
 	  my_errno=HA_ERR_RECORD_DELETED;
 	goto err;
       }
-      if (flag == 0)			/* First block */
+      if (block_of_record++ == 0)			/* First block */
       {
-	flag=1;
 	if (block_info.rec_len > (uint) info->s->base.max_pack_length)
 	  goto panic;
 	if (info->s->base.blobs)
@@ -1147,11 +1174,35 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
       }
       if (left_length < block_info.data_len || ! block_info.data_len)
 	goto panic;			/* Wrong linked record */
-      if (my_pread(file,(byte*) to,block_info.data_len,block_info.filepos,
-		   MYF(MY_NABP)))
-	goto panic;
-      left_length-=block_info.data_len;
-      to+=block_info.data_len;
+      /* copy information that is already read */
+      {
+        uint offset= (uint) (block_info.filepos - filepos);
+        uint prefetch_len= (sizeof(block_info.header) - offset);
+        filepos+= sizeof(block_info.header);
+
+        if (prefetch_len > block_info.data_len)
+          prefetch_len= block_info.data_len;
+        if (prefetch_len)
+        {
+          memcpy((byte*) to, block_info.header + offset, prefetch_len);
+          block_info.data_len-= prefetch_len;
+          left_length-= prefetch_len;
+          to+= prefetch_len;
+        }
+      }
+      /* read rest of record from file */
+      if (block_info.data_len)
+      {
+        if (info->opt_flag & WRITE_CACHE_USED &&
+            info->rec_cache.pos_in_file < filepos + block_info.data_len &&
+            flush_io_cache(&info->rec_cache))
+          goto err;
+        if (my_read(file, (byte*) to, block_info.data_len, MYF(MY_NABP)))
+          goto panic;
+        left_length-=block_info.data_len;
+        to+=block_info.data_len;
+      }
+      filepos= block_info.next_filepos;
     } while (left_length);
 
     info->update|= HA_STATE_AKTIV;	/* We have a aktive record */
@@ -1308,11 +1359,45 @@ err:
 }
 
 
+/*
+  Read record from datafile.
+
+  SYNOPSIS
+    _mi_read_rnd_dynamic_record()
+      info                      MI_INFO pointer to table.
+      buf                       Destination for record.
+      filepos                   From where to read the record.
+      skip_deleted_blocks       If to repeat reading until a non-deleted
+                                record is found.
+
+  NOTE
+
+    If a write buffer is active, it needs to be flushed if its contents
+    intersects with the record to read. We always check if the position
+    of the first byte of the write buffer is lower than the position
+    past the last byte to read. In theory this is also true if the write
+    buffer is completely below the read segment. That is, if there is no
+    intersection. But this case is unusual. We flush anyway. Only if the
+    first byte in the write buffer is above the last byte to read, we do
+    not flush.
+
+    A dynamic record may need several reads. So this check must be done
+    before every read. Reading a dynamic record starts with reading the
+    block header. If the record does not fit into the free space of the
+    header, the block may be longer than the header. In this case a
+    second read is necessary. These one or two reads repeat for every
+    part of the record.
+
+  RETURN
+    0           OK
+    != 0        Error
+*/
+
 int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
 				register my_off_t filepos,
-				my_bool skipp_deleted_blocks)
+				my_bool skip_deleted_blocks)
 {
-  int flag,info_read,save_errno;
+  int block_of_record, info_read, save_errno;
   uint left_len,b_type;
   byte *to;
   MI_BLOCK_INFO block_info;
@@ -1338,7 +1423,8 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
   else
     info_read=1;				/* memory-keyinfoblock is ok */
 
-  flag=block_info.second_read=0;
+  block_of_record= 0;   /* First block of record is numbered as zero. */
+  block_info.second_read= 0;
   left_len=1;
   do
   {
@@ -1361,15 +1447,15 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
     {
       if (_mi_read_cache(&info->rec_cache,(byte*) block_info.header,filepos,
 			 sizeof(block_info.header),
-			 (!flag && skipp_deleted_blocks ? READING_NEXT : 0) |
-			 READING_HEADER))
+			 (!block_of_record && skip_deleted_blocks ?
+                          READING_NEXT : 0) | READING_HEADER))
 	goto panic;
       b_type=_mi_get_block_info(&block_info,-1,filepos);
     }
     else
     {
       if (info->opt_flag & WRITE_CACHE_USED &&
-	  info->rec_cache.pos_in_file <= filepos &&
+	  info->rec_cache.pos_in_file < filepos + MI_BLOCK_INFO_HEADER_LENGTH &&
 	  flush_io_cache(&info->rec_cache))
 	DBUG_RETURN(my_errno);
       info->rec_cache.seek_not_done=1;
@@ -1380,7 +1466,7 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
 		  BLOCK_FATAL_ERROR))
     {
       if ((b_type & (BLOCK_DELETED | BLOCK_SYNC_ERROR))
-	  && skipp_deleted_blocks)
+	  && skip_deleted_blocks)
       {
 	filepos=block_info.filepos+block_info.block_len;
 	block_info.second_read=0;
@@ -1394,7 +1480,7 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
       }
       goto err;
     }
-    if (flag == 0)				/* First block */
+    if (block_of_record == 0)				/* First block */
     {
       if (block_info.rec_len > (uint) share->base.max_pack_length)
 	goto panic;
@@ -1427,7 +1513,7 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
 	left_len-=tmp_length;
 	to+=tmp_length;
 	filepos+=tmp_length;
-     }
+      }
     }
     /* read rest of record from file */
     if (block_info.data_len)
@@ -1436,11 +1522,17 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
       {
 	if (_mi_read_cache(&info->rec_cache,(byte*) to,filepos,
 			   block_info.data_len,
-			   (!flag && skipp_deleted_blocks) ? READING_NEXT :0))
+			   (!block_of_record && skip_deleted_blocks) ?
+                           READING_NEXT : 0))
 	  goto panic;
       }
       else
       {
+        if (info->opt_flag & WRITE_CACHE_USED &&
+            info->rec_cache.pos_in_file <
+            block_info.filepos + block_info.data_len &&
+            flush_io_cache(&info->rec_cache))
+          goto err;
 	/* VOID(my_seek(info->dfile,filepos,MY_SEEK_SET,MYF(0))); */
 	if (my_read(info->dfile,(byte*) to,block_info.data_len,MYF(MY_NABP)))
 	{
@@ -1450,10 +1542,14 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
 	}
       }
     }
-    if (flag++ == 0)
+    /*
+      Increment block-of-record counter. If it was the first block,
+      remember the position behind the block for the next call.
+    */
+    if (block_of_record++ == 0)
     {
-      info->nextpos=block_info.filepos+block_info.block_len;
-      skipp_deleted_blocks=0;
+      info->nextpos= block_info.filepos + block_info.block_len;
+      skip_deleted_blocks= 0;
     }
     left_len-=block_info.data_len;
     to+=block_info.data_len;
@@ -1485,6 +1581,11 @@ uint _mi_get_block_info(MI_BLOCK_INFO *info, File file, my_off_t filepos)
 
   if (file >= 0)
   {
+    /*
+      We do not use my_pread() here because we want to have the file
+      pointer set to the end of the header after this function.
+      my_pread() may leave the file pointer untouched.
+    */
     VOID(my_seek(file,filepos,MY_SEEK_SET,MYF(0)));
     if (my_read(file,(char*) header,sizeof(info->header),MYF(0)) !=
 	sizeof(info->header))

From 568b49fb7dad0a08a4d57925fd5083f184169cdf Mon Sep 17 00:00:00 2001
From: unknown <msvensson@neptunus.(none)>
Date: Mon, 24 Jul 2006 14:31:37 +0200
Subject: [PATCH 04/19] Bug#21125 mysqldump: Problem with non-standard table
 names  - The mysql-test/std_data/bug15328.cnf file was not copied to install
 or dist dir.

mysql-test/Makefile.am:
  Add std_data/*.cnf files to dist_hook and install-data-local
scripts/make_win_src_distribution.sh:
  Copy *.cnf files as well.
---
 mysql-test/Makefile.am               | 2 ++
 scripts/make_win_src_distribution.sh | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am
index 7c2415dd6b6..cd939417e64 100644
--- a/mysql-test/Makefile.am
+++ b/mysql-test/Makefile.am
@@ -60,6 +60,7 @@ dist-hook:
 	$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(distdir)/std_data
+	$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(distdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(distdir)/lib
 	$(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib
 
@@ -83,6 +84,7 @@ install-data-local:
 	$(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include
 	$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(DESTDIR)$(testdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/*.*001 $(DESTDIR)$(testdir)/std_data
+	$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(DESTDIR)$(testdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(DESTDIR)$(testdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/Moscow_leap $(DESTDIR)$(testdir)/std_data
 	$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(DESTDIR)$(testdir)/std_data
diff --git a/scripts/make_win_src_distribution.sh b/scripts/make_win_src_distribution.sh
index 4e5cc2ada46..742f6b9e994 100644
--- a/scripts/make_win_src_distribution.sh
+++ b/scripts/make_win_src_distribution.sh
@@ -206,7 +206,7 @@ copy_dir_files()
     for i in *.c *.cpp *.h *.ih *.i *.ic *.asm *.def *.hpp *.yy \
              README INSTALL* LICENSE AUTHORS NEWS ChangeLog \
              *.inc *.test *.result *.pem Moscow_leap des_key_file \
-             *.vcproj *.sln *.dat *.000001 *.require *.opt
+             *.vcproj *.sln *.dat *.000001 *.require *.opt *.cnf
     do
       if [ -f $i ]
       then

From 8634c6b6925a9467a6a40ab94b237d3eb9b67e83 Mon Sep 17 00:00:00 2001
From: unknown <pgalbraith/patg@buffy.netfrastructure.com>
Date: Thu, 27 Jul 2006 14:02:58 -0400
Subject: [PATCH 05/19] BUG #21118 "Federated Transaction test needs to have
 BDB switched to InnoDB"

Changed federated_transactions.test to use InnoDB instead of BDB

federated_transactions-slave.opt:
  BitKeeper file /home/patg/mysql-build/mysql-5.1-engines-bug21118/mysql-test/t/federated_transactions-slave.opt
federated_transactions.result:
  BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  New test results for InnoDB being remote transactional table
federated_transactions.test:
  BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  Changed remote transactional table from BDB to InnoDB


mysql-test/t/federated_transactions.test:
  BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  Changed remote transactional table from BDB to InnoDB
mysql-test/r/federated_transactions.result:
  BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  New test results for InnoDB being remote transactional table
mysql-test/t/federated_transactions-slave.opt:
  BitKeeper file /home/patg/mysql-build/mysql-5.1-engines-bug21118/mysql-test/t/federated_transactions-slave.opt
---
 mysql-test/r/federated_transactions.result    | 2 +-
 mysql-test/t/federated_transactions-slave.opt | 1 +
 mysql-test/t/federated_transactions.test      | 4 ++--
 3 files changed, 4 insertions(+), 3 deletions(-)
 create mode 100644 mysql-test/t/federated_transactions-slave.opt

diff --git a/mysql-test/r/federated_transactions.result b/mysql-test/r/federated_transactions.result
index 403b65b5484..e6714210ded 100644
--- a/mysql-test/r/federated_transactions.result
+++ b/mysql-test/r/federated_transactions.result
@@ -16,7 +16,7 @@ CREATE TABLE federated.t1 (
 `id` int(20) NOT NULL,
 `name` varchar(32) NOT NULL default ''
     )
-DEFAULT CHARSET=latin1 ENGINE=BerkeleyDB;
+DEFAULT CHARSET=latin1 ENGINE=InnoDB;
 DROP TABLE IF EXISTS federated.t1;
 Warnings:
 Note	1051	Unknown table 't1'
diff --git a/mysql-test/t/federated_transactions-slave.opt b/mysql-test/t/federated_transactions-slave.opt
new file mode 100644
index 00000000000..627becdbfb5
--- /dev/null
+++ b/mysql-test/t/federated_transactions-slave.opt
@@ -0,0 +1 @@
+--innodb
diff --git a/mysql-test/t/federated_transactions.test b/mysql-test/t/federated_transactions.test
index 5095c8ce9c3..128813ed160 100644
--- a/mysql-test/t/federated_transactions.test
+++ b/mysql-test/t/federated_transactions.test
@@ -1,6 +1,6 @@
 # should work with embedded server after mysqltest is fixed
 -- source include/not_embedded.inc
-source include/have_bdb.inc;
+#source include/have_innodb.inc;
 source include/federated.inc;
 
 connection slave;
@@ -10,7 +10,7 @@ CREATE TABLE federated.t1 (
     `id` int(20) NOT NULL,
     `name` varchar(32) NOT NULL default ''
     )
-  DEFAULT CHARSET=latin1 ENGINE=BerkeleyDB;
+  DEFAULT CHARSET=latin1 ENGINE=InnoDB;
 
 connection master;
 DROP TABLE IF EXISTS federated.t1;

From 94ebe8cb7a3a610cae81123b14104f4f7f2a49c5 Mon Sep 17 00:00:00 2001
From: unknown <pgalbraith/patg@buffy.netfrastructure.com>
Date: Thu, 27 Jul 2006 14:20:25 -0400
Subject: [PATCH 06/19]  BUG #21118 "Federated Transaction test needs to have
 BDB switched to InnoDB"

recommented the uncommented have_innodb.inc line

federated_transactions.test:
   BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  slight ommission fixed


mysql-test/t/federated_transactions.test:
   BUG #21118 "Federated Transaction test needs to have BDB switched to InnoDB"
  slight ommission fixed
---
 mysql-test/t/federated_transactions.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mysql-test/t/federated_transactions.test b/mysql-test/t/federated_transactions.test
index 128813ed160..9f3b030f462 100644
--- a/mysql-test/t/federated_transactions.test
+++ b/mysql-test/t/federated_transactions.test
@@ -1,6 +1,6 @@
 # should work with embedded server after mysqltest is fixed
 -- source include/not_embedded.inc
-#source include/have_innodb.inc;
+source include/have_innodb.inc;
 source include/federated.inc;
 
 connection slave;

From 721b1d7fc69a32fab4c055691e8ee1fb93e0abda Mon Sep 17 00:00:00 2001
From: unknown <ingo/mydev@chilla.local>
Date: Sat, 29 Jul 2006 21:58:50 +0200
Subject: [PATCH 07/19] Bug#20719 - Reading dynamic records with write buffer
 could fail After merge fix

---
 myisam/mi_dynrec.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/myisam/mi_dynrec.c b/myisam/mi_dynrec.c
index 51f2ff349f8..4dec3055fa1 100644
--- a/myisam/mi_dynrec.c
+++ b/myisam/mi_dynrec.c
@@ -1141,6 +1141,9 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
     block_info.second_read= 0;
     do
     {
+      /* A corrupted table can have wrong pointers. (Bug# 19835) */
+      if (filepos == HA_OFFSET_ERROR)
+        goto panic;
       if (info->opt_flag & WRITE_CACHE_USED &&
 	  info->rec_cache.pos_in_file < filepos + MI_BLOCK_INFO_HEADER_LENGTH &&
 	  flush_io_cache(&info->rec_cache))

From 9493d46476230837d7bc27d5c938105d471bb5a4 Mon Sep 17 00:00:00 2001
From: unknown <ingo/mydev@chilla.local>
Date: Sun, 30 Jul 2006 06:19:30 +0200
Subject: [PATCH 08/19] Bug#20719 - Reading dynamic records with write buffer
 could fail After merge fix

---
 myisam/mi_dynrec.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/myisam/mi_dynrec.c b/myisam/mi_dynrec.c
index f834cc5a724..ef5ab73f1a9 100644
--- a/myisam/mi_dynrec.c
+++ b/myisam/mi_dynrec.c
@@ -1187,9 +1187,6 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
 	  info->rec_cache.pos_in_file < filepos + MI_BLOCK_INFO_HEADER_LENGTH &&
 	  flush_io_cache(&info->rec_cache))
 	goto err;
-      /* A corrupted table can have wrong pointers. (Bug# 19835) */
-      if (block_info.next_filepos == HA_OFFSET_ERROR)
-        goto panic;
       info->rec_cache.seek_not_done=1;
       if ((b_type= _mi_get_block_info(&block_info, file, filepos))
 	  & (BLOCK_DELETED | BLOCK_ERROR | BLOCK_SYNC_ERROR |

From fe84903b15772782aa3bfbaa5fee60d480eaa4f2 Mon Sep 17 00:00:00 2001
From: unknown <serg@janus.mylan>
Date: Tue, 1 Aug 2006 14:02:19 +0200
Subject: [PATCH 09/19] compile-time definition of intptr type

config/ac-macros/misc.m4:
  remove unnecessary macro
configure.in:
  use AC_CHECK_SIZEOF when appropriate
---
 config/ac-macros/misc.m4 | 30 ------------------------------
 configure.in             |  2 +-
 include/my_atomic.h      |  8 +++++++-
 3 files changed, 8 insertions(+), 32 deletions(-)

diff --git a/config/ac-macros/misc.m4 b/config/ac-macros/misc.m4
index 3ed64b5625b..fdce85aa136 100644
--- a/config/ac-macros/misc.m4
+++ b/config/ac-macros/misc.m4
@@ -1,35 +1,5 @@
 # Local macros for automake & autoconf
 
-# A local version of AC_CHECK_SIZEOF that includes sys/types.h
-dnl MYSQL_CHECK_SIZEOF(TYPE [, CROSS-SIZE])
-AC_DEFUN([MYSQL_CHECK_SIZEOF],
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(size of $1)
-AC_CACHE_VAL(AC_CV_NAME,
-[AC_TRY_RUN([#include <stdio.h>
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-main()
-{
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  fprintf(f, "%d\n", sizeof($1));
-  exit(0);
-}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2))])dnl
-AC_MSG_RESULT($AC_CV_NAME)
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [ ])
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-])
-
 #---START: Used in for client configure
 AC_DEFUN([MYSQL_TYPE_ACCEPT],
 [ac_save_CXXFLAGS="$CXXFLAGS"
diff --git a/configure.in b/configure.in
index 1306a3cc74d..49da91797fc 100644
--- a/configure.in
+++ b/configure.in
@@ -1687,7 +1687,7 @@ then
   AC_MSG_ERROR("MySQL needs a long long type.")
 fi
 # off_t is not a builtin type
-MYSQL_CHECK_SIZEOF(off_t, 4)
+AC_CHECK_SIZEOF(off_t, 4)
 if test "$ac_cv_sizeof_off_t" -eq 0
 then
   AC_MSG_ERROR("MySQL needs a off_t type.")
diff --git a/include/my_atomic.h b/include/my_atomic.h
index c916026c0e0..9a319f84451 100644
--- a/include/my_atomic.h
+++ b/include/my_atomic.h
@@ -135,7 +135,13 @@ make_atomic_swap(ptr)
 #undef _atomic_h_cleanup_
 #endif
 
-typedef int32 intptr; /* TODO configure check */
+#if SIZEOF_CHARP == SIZEOF_INT
+typedef int intptr;
+#elif SIZEOF_CHARP == SIZEOF_LONG
+typedef long intptr;
+#else
+#error
+#endif
 
 #define MY_ATOMIC_OK       0
 #define MY_ATOMIC_NOT_1CPU 1

From 53cc83fef234277af1b3d2362d070f737c854390 Mon Sep 17 00:00:00 2001
From: unknown <tsmith@maint1.mysql.com>
Date: Wed, 2 Aug 2006 02:21:36 +0200
Subject: [PATCH 10/19] .del-sp.test.orig:   Delete: mysql-test/t/sp.test.orig

BitKeeper/deleted/.del-sp.test.orig:
  Delete: mysql-test/t/sp.test.orig
---
 mysql-test/t/sp.test.orig | 5716 -------------------------------------
 1 file changed, 5716 deletions(-)
 delete mode 100644 mysql-test/t/sp.test.orig

diff --git a/mysql-test/t/sp.test.orig b/mysql-test/t/sp.test.orig
deleted file mode 100644
index a4b99620344..00000000000
--- a/mysql-test/t/sp.test.orig
+++ /dev/null
@@ -1,5716 +0,0 @@
-#
-# Basic stored PROCEDURE tests
-#
-# Please keep this file free of --error cases and other
-# things that will not run in a single debugged mysqld
-# process (e.g. master-slave things).
-#
-# Test cases for bugs are added at the end. See template there.
-#
-# Tests that require --error go into sp-error.test
-# Tests that require inndb go into sp_trans.test
-# Tests that check privilege and security issues go to sp-security.test.
-# Tests that require multiple connections, except security/privilege tests,
-#   go to sp-thread.
-# Tests that uses 'goto' to into sp-goto.test (currently disabled)
-# Tests that destroys system tables (e.g. mysql.proc) for error testing
-#   go to sp-destruct.
-
-use test;
-
-# Test tables
-#
-# t1 and t2 are reused throughout the file, and dropped at the end.
-# t3 and up are created and dropped when needed.
-#
---disable_warnings
-drop table if exists t1,t2,t3,t4;
---enable_warnings
-create table t1 (
-	id   char(16) not null default '',
-        data int not null
-);
-create table t2 (
-	s   char(16),
-        i   int,
-	d   double
-);
-
-
-# Single statement, no params.
---disable_warnings
-drop procedure if exists foo42;
---enable_warnings
-create procedure foo42()
-  insert into test.t1 values ("foo", 42);
-
-call foo42();
-select * from t1;
-delete from t1;
-drop procedure foo42;
-
-
-# Single statement, two IN params.
---disable_warnings
-drop procedure if exists bar;
---enable_warnings
-create procedure bar(x char(16), y int)
-  insert into test.t1 values (x, y);
-
-call bar("bar", 666);
-select * from t1;
-delete from t1;
-# Don't drop procedure yet...
-
-
-# Now for multiple statements...
-delimiter |;
-
-# Empty statement
---disable_warnings
-drop procedure if exists empty|
---enable_warnings
-create procedure empty()
-begin
-end|
-
-call empty()|
-drop procedure empty|
-
-# Scope test. This is legal (warnings might be possible in the future,
-# but for the time being, we just accept it).
---disable_warnings
-drop procedure if exists scope|
---enable_warnings
-create procedure scope(a int, b float)
-begin
-  declare b int;
-  declare c float;
-
-  begin
-    declare c int;
-  end;
-end|
-
-drop procedure scope|
-
-# Two statements.
---disable_warnings
-drop procedure if exists two|
---enable_warnings
-create procedure two(x1 char(16), x2 char(16), y int)
-begin
-  insert into test.t1 values (x1, y);
-  insert into test.t1 values (x2, y);
-end|
-
-call two("one", "two", 3)|
-select * from t1|
-delete from t1|
-drop procedure two|
-
-
-# Simple test of local variables and SET.
---disable_warnings
-drop procedure if exists locset|
---enable_warnings
-create procedure locset(x char(16), y int)
-begin
-  declare z1, z2 int;
-  set z1 = y;
-  set z2 = z1+2;
-  insert into test.t1 values (x, z2);
-end|
-
-call locset("locset", 19)|
-select * from t1|
-delete from t1|
-drop procedure locset|
-
-
-# In some contexts local variables are not recognized
-# (and in some, you have to qualify the identifier).
---disable_warnings
-drop procedure if exists setcontext|
---enable_warnings
-create procedure setcontext()
-begin
-  declare data int default 2;
-
-  insert into t1 (id, data) values ("foo", 1);
-  replace t1 set data = data, id = "bar";
-  update t1 set id = "kaka", data = 3 where t1.data = data;
-end|
-
-call setcontext()|
-select * from t1|
-delete from t1|
-drop procedure setcontext|
-
-
-# Set things to null
-create table t3 ( d date, i int, f double, s varchar(32) )|
-
---disable_warnings
-drop procedure if exists nullset|
---enable_warnings
-create procedure nullset()
-begin
-  declare ld date;
-  declare li int;
-  declare lf double;
-  declare ls varchar(32);
-
-  set ld = null, li = null, lf = null, ls = null;
-  insert into t3 values (ld, li, lf, ls);
-
-  insert into t3 (i, f, s) values ((ld is null), 1,    "ld is null"),
-                                  ((li is null), 1,    "li is null"),
-				  ((li = 0),     null, "li = 0"),
-				  ((lf is null), 1,    "lf is null"),
-				  ((lf = 0),     null, "lf = 0"),
-				  ((ls is null), 1,    "ls is null");
-end|
-
-call nullset()|
-select * from t3|
-drop table t3|
-drop procedure nullset|
-
-
-# The peculiar (non-standard) mixture of variables types in SET.
---disable_warnings
-drop procedure if exists mixset|
---enable_warnings
-create procedure mixset(x char(16), y int)
-begin
-  declare z int;
-
-  set @z = y, z = 666, max_join_size = 100;
-  insert into test.t1 values (x, z);
-end|
-
-call mixset("mixset", 19)|
-show variables like 'max_join_size'|
-select id,data,@z from t1|
-delete from t1|
-drop procedure mixset|
-
-
-# Multiple CALL statements, one with OUT parameter.
---disable_warnings
-drop procedure if exists zip|
---enable_warnings
-create procedure zip(x char(16), y int)
-begin
-  declare z int;
-  call zap(y, z);
-  call bar(x, z);
-end|
-
-# SET local variables and OUT parameter.
---disable_warnings
-drop procedure if exists zap|
---enable_warnings
-create procedure zap(x int, out y int)
-begin
-  declare z int;
-  set z = x+1, y = z;
-end|
-
-call zip("zip", 99)|
-select * from t1|
-delete from t1|
-drop procedure zip|
-drop procedure bar|
-
-# Top-level OUT parameter
-call zap(7, @zap)|
-select @zap|
-
-drop procedure zap|
-
-
-# "Deep" calls...
---disable_warnings
-drop procedure if exists c1|
---enable_warnings
-create procedure c1(x int)
-  call c2("c", x)|
---disable_warnings
-drop procedure if exists c2|
---enable_warnings
-create procedure c2(s char(16), x int)
-  call c3(x, s)|
---disable_warnings
-drop procedure if exists c3|
---enable_warnings
-create procedure c3(x int, s char(16))
-  call c4("level", x, s)|
---disable_warnings
-drop procedure if exists c4|
---enable_warnings
-create procedure c4(l char(8), x int, s char(16))
-  insert into t1 values (concat(l,s), x)|
-
-call c1(42)|
-select * from t1|
-delete from t1|
-drop procedure c1|
-drop procedure c2|
-drop procedure c3|
-drop procedure c4|
-
-# INOUT test
---disable_warnings
-drop procedure if exists iotest|
---enable_warnings
-create procedure iotest(x1 char(16), x2 char(16), y int)
-begin
-  call inc2(x2, y);
-  insert into test.t1 values (x1, y);
-end|
-
---disable_warnings
-drop procedure if exists inc2|
---enable_warnings
-create procedure inc2(x char(16), y int)
-begin
-  call inc(y);
-  insert into test.t1 values (x, y);
-end|
-
---disable_warnings
-drop procedure if exists inc|
---enable_warnings
-create procedure inc(inout io int)
-  set io = io + 1|
-
-call iotest("io1", "io2", 1)|
-select * from t1|
-delete from t1|
-drop procedure iotest|
-drop procedure inc2|
-
-# Propagating top-level @-vars
---disable_warnings
-drop procedure if exists incr|
---enable_warnings
-create procedure incr(inout x int)
-  call inc(x)|
-
-# Before
-select @zap|
-call incr(@zap)|
-# After
-select @zap|
-
-drop procedure inc|
-drop procedure incr|
-
-# Call-by-value test
-#  The expected result is:
-#    ("cbv2", 4)
-#    ("cbv1", 4711)
---disable_warnings
-drop procedure if exists cbv1|
---enable_warnings
-create procedure cbv1()
-begin
-  declare y int default 3;
-
-  call cbv2(y+1, y);
-  insert into test.t1 values ("cbv1", y);
-end|
-
---disable_warnings
-drop procedure if exists cbv2|
---enable_warnings
-create procedure cbv2(y1 int, inout y2 int)
-begin
-  set y2 = 4711;
-  insert into test.t1 values ("cbv2", y1);
-end|
-
-call cbv1()|
-select * from t1|
-delete from t1|
-drop procedure cbv1|
-drop procedure cbv2|
-
-
-# Subselect arguments
-
-insert into t2 values ("a", 1, 1.1), ("b", 2, 1.2), ("c", 3, 1.3)|
-
---disable_warnings
-drop procedure if exists sub1|
---enable_warnings
-create procedure sub1(id char(16), x int)
-  insert into test.t1 values (id, x)|
-
---disable_warnings
-drop procedure if exists sub2|
---enable_warnings
-create procedure sub2(id char(16))
-begin
-  declare x int;
-  set x = (select sum(t.i) from test.t2 t);
-  insert into test.t1 values (id, x);
-end|
-
---disable_warnings
-drop procedure if exists sub3|
---enable_warnings
-create function sub3(i int) returns int
-  return i+1|
-
-call sub1("sub1a", (select 7))|
-call sub1("sub1b", (select max(i) from t2))|
---error ER_OPERAND_COLUMNS
-call sub1("sub1c", (select i,d from t2 limit 1))|
-call sub1("sub1d", (select 1 from (select 1) a))|
-call sub2("sub2")|
-select * from t1|
-select sub3((select max(i) from t2))|
-drop procedure sub1|
-drop procedure sub2|
-drop function sub3|
-delete from t1|
-delete from t2|
-
-# Basic tests of the flow control constructs
-
-# Just test on 'x'...
---disable_warnings
-drop procedure if exists a0|
---enable_warnings
-create procedure a0(x int)
-while x do
-  set x = x-1;
-  insert into test.t1 values ("a0", x);
-end while|
-
-call a0(3)|
-select * from t1|
-delete from t1|
-drop procedure a0|
-
-
-# The same, but with a more traditional test.
---disable_warnings
-drop procedure if exists a|
---enable_warnings
-create procedure a(x int)
-while x > 0 do
-  set x = x-1;
-  insert into test.t1 values ("a", x);
-end while|
-
-call a(3)|
-select * from t1|
-delete from t1|
-drop procedure a|
-
-
-# REPEAT
---disable_warnings
-drop procedure if exists b|
---enable_warnings
-create procedure b(x int)
-repeat
-  insert into test.t1 values (repeat("b",3), x);
-  set x = x-1;
-until x = 0 end repeat|
-
-call b(3)|
-select * from t1|
-delete from t1|
-drop procedure b|
-
-
-# Check that repeat isn't parsed the wrong way
---disable_warnings
-drop procedure if exists b2|
---enable_warnings
-create procedure b2(x int)
-repeat(select 1 into outfile 'b2');
-  insert into test.t1 values (repeat("b2",3), x);
-  set x = x-1;
-until x = 0 end repeat|
-
-# We don't actually want to call it.
-drop procedure b2|
-
-
-# Labelled WHILE with ITERATE (pointless really)
---disable_warnings
-drop procedure if exists c|
---enable_warnings
-create procedure c(x int)
-hmm: while x > 0 do
-  insert into test.t1 values ("c", x);
-  set x = x-1;
-  iterate hmm;
-  insert into test.t1 values ("x", x);
-end while hmm|
-
-call c(3)|
-select * from t1|
-delete from t1|
-drop procedure c|
-
-
-# Labelled WHILE with LEAVE
---disable_warnings
-drop procedure if exists d|
---enable_warnings
-create procedure d(x int)
-hmm: while x > 0 do
-  insert into test.t1 values ("d", x);
-  set x = x-1;
-  leave hmm;
-  insert into test.t1 values ("x", x);
-end while|
-
-call d(3)|
-select * from t1|
-delete from t1|
-drop procedure d|
-
-
-# LOOP, with simple IF statement
---disable_warnings
-drop procedure if exists e|
---enable_warnings
-create procedure e(x int)
-foo: loop
-  if x = 0 then
-    leave foo;
-  end if;
-  insert into test.t1 values ("e", x);
-  set x = x-1;
-end loop foo|
-
-call e(3)|
-select * from t1|
-delete from t1|
-drop procedure e|
-
-
-# A full IF statement
---disable_warnings
-drop procedure if exists f|
---enable_warnings
-create procedure f(x int)
-if x < 0 then
-  insert into test.t1 values ("f", 0);
-elseif x = 0 then
-  insert into test.t1 values ("f", 1);
-else
-  insert into test.t1 values ("f", 2);
-end if|
-
-call f(-2)|
-call f(0)|
-call f(4)|
-select * from t1|
-delete from t1|
-drop procedure f|
-
-
-# This form of CASE is really just syntactic sugar for IF-ELSEIF-...
---disable_warnings
-drop procedure if exists g|
---enable_warnings
-create procedure g(x int)
-case
-when x < 0 then
-  insert into test.t1 values ("g", 0);
-when x = 0 then
-  insert into test.t1 values ("g", 1);
-else
-  insert into test.t1 values ("g", 2);
-end case|
-
-call g(-42)|
-call g(0)|
-call g(1)|
-select * from t1|
-delete from t1|
-drop procedure g|
-
-
-# The "simple CASE"
---disable_warnings
-drop procedure if exists h|
---enable_warnings
-create procedure h(x int)
-case x
-when 0 then
-  insert into test.t1 values ("h0", x);
-when 1 then
-  insert into test.t1 values ("h1", x);
-else
-  insert into test.t1 values ("h?", x);
-end case|
-
-call h(0)|
-call h(1)|
-call h(17)|
-select * from t1|
-delete from t1|
-drop procedure h|
-
-
-# It's actually possible to LEAVE a BEGIN-END block
---disable_warnings
-drop procedure if exists i|
---enable_warnings
-create procedure i(x int)
-foo:
-begin
-  if x = 0 then
-    leave foo;
-  end if;
-  insert into test.t1 values ("i", x);
-end foo|
-
-call i(0)|
-call i(3)|
-select * from t1|
-delete from t1|
-drop procedure i|
-
-
-# SELECT with one of more result set sent back to the clinet
-insert into t1 values ("foo", 3), ("bar", 19)|
-insert into t2 values ("x", 9, 4.1), ("y", -1, 19.2), ("z", 3, 2.2)|
-
---disable_warnings
-drop procedure if exists sel1|
---enable_warnings
-create procedure sel1()
-begin
-  select * from t1;
-end|
-
-call sel1()|
-drop procedure sel1|
-
---disable_warnings
-drop procedure if exists sel2|
---enable_warnings
-create procedure sel2()
-begin
-  select * from t1;
-  select * from t2;
-end|
-
-call sel2()|
-drop procedure sel2|
-delete from t1|
-delete from t2|
-
-# SELECT INTO local variables
---disable_warnings
-drop procedure if exists into_test|
---enable_warnings
-create procedure into_test(x char(16), y int)
-begin
-  insert into test.t1 values (x, y);
-  select id,data into x,y from test.t1 limit 1;
-  insert into test.t1 values (concat(x, "2"), y+2);
-end|
-
-call into_test("into", 100)|
-select * from t1|
-delete from t1|
-drop procedure into_test|
-
-
-# SELECT INTO with a mix of local and global variables
---disable_warnings
-drop procedure if exists into_tes2|
---enable_warnings
-create procedure into_test2(x char(16), y int)
-begin
-  insert into test.t1 values (x, y);
-  select id,data into x,@z from test.t1 limit 1;
-  insert into test.t1 values (concat(x, "2"), y+2);
-end|
-
-call into_test2("into", 100)|
-select id,data,@z from t1|
-delete from t1|
-drop procedure into_test2|
-
-
-# SELECT * INTO ... (bug test)
---disable_warnings
-drop procedure if exists into_test3|
---enable_warnings
-create procedure into_test3()
-begin
-  declare x char(16);
-  declare y int;
-
-  select * into x,y from test.t1 limit 1;
-  insert into test.t2 values (x, y, 0.0);
-end|
-
-insert into t1 values ("into3", 19)|
-# Two call needed for bug test
-call into_test3()|
-call into_test3()|
-select * from t2|
-delete from t1|
-delete from t2|
-drop procedure into_test3|
-
-
-# SELECT INTO with no data is a warning ("no data", which we will
-# not see normally). When not caught, execution proceeds.
---disable_warnings
-drop procedure if exists into_test4|
---enable_warnings
-create procedure into_test4()
-begin
-  declare x int;
-
-  select data into x from test.t1 limit 1;
-  insert into test.t3 values ("into4", x);
-end|
-
-delete from t1|
-create table t3 ( s char(16), d int)|
-call into_test4()|
-select * from t3|
-insert into t1 values ("i4", 77)|
-call into_test4()|
-select * from t3|
-delete from t1|
-drop table t3|
-drop procedure into_test4|
-
-
-# These two (and the two procedures above) caused an assert() to fail in
-# sql_base.cc:lock_tables() at some point.
---disable_warnings
-drop procedure if exists into_outfile|
---enable_warnings
-create procedure into_outfile(x char(16), y int)
-begin
-  insert into test.t1 values (x, y);
-  select * into outfile "../tmp/spout" from test.t1;
-  insert into test.t1 values (concat(x, "2"), y+2);
-end|
-
---system rm -f $MYSQLTEST_VARDIR/tmp/spout
-call into_outfile("ofile", 1)|
---system rm -f $MYSQLTEST_VARDIR/tmp/spout
-delete from t1|
-drop procedure into_outfile|
-
---disable_warnings
-drop procedure if exists into_dumpfile|
---enable_warnings
-create procedure into_dumpfile(x char(16), y int)
-begin
-  insert into test.t1 values (x, y);
-  select * into dumpfile "../tmp/spdump" from test.t1 limit 1;
-  insert into test.t1 values (concat(x, "2"), y+2);
-end|
-
---system rm -f $MYSQLTEST_VARDIR/tmp/spdump
-call into_dumpfile("dfile", 1)|
---system rm -f $MYSQLTEST_VARDIR/tmp/spdump
-delete from t1|
-drop procedure into_dumpfile|
-
---disable_warnings
-drop procedure if exists create_select|
---enable_warnings
-create procedure create_select(x char(16), y int)
-begin
-  insert into test.t1 values (x, y);
-  create temporary table test.t3 select * from test.t1;
-  insert into test.t3 values (concat(x, "2"), y+2);
-end|
-
-call create_select("cs", 90)|
-select * from t1, t3|
-drop table t3|
-delete from t1|
-drop procedure create_select|
-
-
-# A minimal, constant FUNCTION.
---disable_warnings
-drop function if exists e|
---enable_warnings
-create function e() returns double
-  return 2.7182818284590452354|
-
-set @e = e()|
-select e(), @e|
-
-# A minimal function with one argument
---disable_warnings
-drop function if exists inc|
---enable_warnings
-create function inc(i int) returns int
-  return i+1|
-
-select inc(1), inc(99), inc(-71)|
-
-# A minimal function with two arguments
---disable_warnings
-drop function if exists mul|
---enable_warnings
-create function mul(x int, y int) returns int
-  return x*y|
-
-select mul(1,1), mul(3,5), mul(4711, 666)|
-
-# A minimal string function
---disable_warnings
-drop function if exists append|
---enable_warnings
-create function append(s1 char(8), s2 char(8)) returns char(16)
-  return concat(s1, s2)|
-
-select append("foo", "bar")|
-
-# A function with flow control
---disable_warnings
-drop function if exists fac|
---enable_warnings
-create function fac(n int unsigned) returns bigint unsigned
-begin
-  declare f bigint unsigned default 1;
-
-  while n > 1 do
-    set f = f * n;
-    set n = n - 1;
-  end while;
-  return f;
-end|
-
-select fac(1), fac(2), fac(5), fac(10)|
-
-# Nested calls
---disable_warnings
-drop function if exists fun|
---enable_warnings
-create function fun(d double, i int, u int unsigned) returns double
-  return mul(inc(i), fac(u)) / e()|
-
-select fun(2.3, 3, 5)|
-
-
-# Various function calls in differen statements
-
-insert into t2 values (append("xxx", "yyy"), mul(4,3), e())|
-insert into t2 values (append("a", "b"), mul(2,mul(3,4)), fun(1.7, 4, 6))|
-
-# Disable PS because double's give a bit different values
---disable_ps_protocol
-select * from t2 where s = append("a", "b")|
-select * from t2 where i = mul(4,3) or i = mul(mul(3,4),2)|
-select * from t2 where d = e()|
-select * from t2|
---enable_ps_protocol
-delete from t2|
-
-drop function e|
-drop function inc|
-drop function mul|
-drop function append|
-drop function fun|
-
-
-#
-# CONDITIONs and HANDLERs
-#
-
---disable_warnings
-drop procedure if exists hndlr1|
---enable_warnings
-create procedure hndlr1(val int)
-begin
-  declare x int default 0;
-  declare foo condition for 1136;
-  declare bar condition for sqlstate '42S98';        # Just for testing syntax
-  declare zip condition for sqlstate value '42S99';  # Just for testing syntax
-  declare continue handler for foo set x = 1;
-
-  insert into test.t1 values ("hndlr1", val, 2);  # Too many values
-  if (x) then
-    insert into test.t1 values ("hndlr1", val);   # This instead then
-  end if;
-end|
-
-call hndlr1(42)|
-select * from t1|
-delete from t1|
-drop procedure hndlr1|
-
---disable_warnings
-drop procedure if exists hndlr2|
---enable_warnings
-create procedure hndlr2(val int)
-begin
-  declare x int default 0;
-
-  begin
-    declare exit handler for sqlstate '21S01' set x = 1;
-
-    insert into test.t1 values ("hndlr2", val, 2); # Too many values
-  end;
-
-  insert into test.t1 values ("hndlr2", x);
-end|
-
-call hndlr2(42)|
-select * from t1|
-delete from t1|
-drop procedure hndlr2|
-
-
---disable_warnings
-drop procedure if exists hndlr3|
---enable_warnings
-create procedure hndlr3(val int)
-begin
-  declare x int default 0;
-  declare continue handler for sqlexception        # Any error
-  begin
-    declare z int;
-
-    set z = 2 * val;
-    set x = 1;
-  end;
-
-  if val < 10 then
-    begin
-      declare y int;
-
-      set y = val + 10;
-      insert into test.t1 values ("hndlr3", y, 2);  # Too many values
-      if x then
-        insert into test.t1 values ("hndlr3", y);
-      end if;
-    end;
-  end if;
-end|
-
-call hndlr3(3)|
-select * from t1|
-delete from t1|
-drop procedure hndlr3|
-
-
-# Variables might be uninitialized when using handlers
-# (Otherwise the compiler can detect if a variable is not set, but
-#  not in this case.)
-create table t3 ( id   char(16), data int )|
-
---disable_warnings
-drop procedure if exists hndlr4|
---enable_warnings
-create procedure hndlr4()
-begin
-  declare x int default 0;
-  declare val int;	                           # No default
-  declare continue handler for sqlstate '02000' set x=1;
-
-  select data into val from test.t3 where id='z' limit 1;  # No hits
-
-  insert into test.t3 values ('z', val);
-end|
-
-call hndlr4()|
-select * from t3|
-drop table t3|
-drop procedure hndlr4|
-
-
-#
-# Cursors
-#
---disable_warnings
-drop procedure if exists cur1|
---enable_warnings
-create procedure cur1()
-begin
-  declare a char(16);
-  declare b int;
-  declare c double;
-  declare done int default 0;
-  declare c cursor for select * from test.t2;
-  declare continue handler for sqlstate '02000' set done = 1;
-
-  open c;
-  repeat
-    fetch c into a, b, c;
-    if not done then
-       insert into test.t1 values (a, b+c);
-    end if;
-  until done end repeat;
-  close c;
-end|
-
-insert into t2 values ("foo", 42, -1.9), ("bar", 3, 12.1), ("zap", 666, -3.14)|
-call cur1()|
-select * from t1|
-drop procedure cur1|
-
-create table t3 ( s char(16), i int )|
-
---disable_warnings
-drop procedure if exists cur2|
---enable_warnings
-create procedure cur2()
-begin
-  declare done int default 0;
-  declare c1 cursor for select id,data from test.t1;
-  declare c2 cursor for select i from test.t2;
-  declare continue handler for sqlstate '02000' set done = 1;
-
-  open c1;
-  open c2;
-  repeat
-  begin
-    declare a char(16);
-    declare b,c int;
-
-    fetch from c1 into a, b;
-    fetch next from c2 into c;
-    if not done then
-      if b < c then
-        insert into test.t3 values (a, b);
-      else
-        insert into test.t3 values (a, c);
-      end if;
-    end if;
-  end;
-  until done end repeat;
-  close c1;
-  close c2;
-end|
-
-call cur2()|
-select * from t3|
-delete from t1|
-delete from t2|
-drop table t3|
-drop procedure cur2|
-
-
-# The few characteristics we parse
---disable_warnings
-drop procedure if exists chistics|
---enable_warnings
-create procedure chistics()
-    language sql
-    modifies sql data
-    not deterministic
-    sql security definer
-    comment 'Characteristics procedure test'
-  insert into t1 values ("chistics", 1)|
-
-show create procedure chistics|
-# Call it, just to make sure.
-call chistics()|
-select * from t1|
-delete from t1|
-alter procedure chistics sql security invoker|
-show create procedure chistics|
-drop procedure chistics|
-
---disable_warnings
-drop function if exists chistics|
---enable_warnings
-create function chistics() returns int
-    language sql
-    deterministic
-    sql security invoker
-    comment 'Characteristics procedure test'
-  return 42|
-
-show create function chistics|
-# Call it, just to make sure.
-select chistics()|
-alter function chistics
-   no sql
-   comment 'Characteristics function test'|
-show create function chistics|
-drop function chistics|
-
-
-# Check mode settings
-insert into t1 values ("foo", 1), ("bar", 2), ("zip", 3)|
-
-set @@sql_mode = 'ANSI'|
-delimiter $|
---disable_warnings
-drop procedure if exists modes$
---enable_warnings
-create procedure modes(out c1 int, out c2 int)
-begin
-  declare done int default 0;
-  declare x int;
-  declare c cursor for select data from t1;
-  declare continue handler for sqlstate '02000' set done = 1;
-
-  select 1 || 2 into c1;
-  set c2 = 0;
-  open c;
-  repeat
-    fetch c into x;
-    if not done then
-      set c2 = c2 + 1;
-    end if;
-  until done end repeat;
-  close c;
-end$
-delimiter |$
-set @@sql_mode = ''|
-
-set sql_select_limit = 1|
-call modes(@c1, @c2)|
-set sql_select_limit = default|
-
-select @c1, @c2|
-delete from t1|
-drop procedure modes|
-
-
-# Check that dropping a database without routines works.
-# (Dropping with routines is tested in sp-security.test)
-# First an empty db.
-create database sp_db1|
-drop database sp_db1|
-
-# Again, with a table.
-create database sp_db2|
-use sp_db2|
-# Just put something in here...
-create table t3 ( s char(4), t int )|
-insert into t3 values ("abcd", 42), ("dcba", 666)|
-use test|
-drop database sp_db2|
-
-# And yet again, with just a procedure.
-create database sp_db3|
-use sp_db3|
---disable_warnings
-drop procedure if exists dummy|
---enable_warnings
-create procedure dummy(out x int)
-  set x = 42|
-use test|
-drop database sp_db3|
-# Check that it's gone
-select type,db,name from mysql.proc where db = 'sp_db3'|
-
-
-# ROW_COUNT() function after a CALL
-# We test the other cases here too, although it's not strictly SP specific
---disable_warnings
-drop procedure if exists rc|
---enable_warnings
-create procedure rc()
-begin
-  delete from t1;
-  insert into t1 values ("a", 1), ("b", 2), ("c", 3);
-end|
-
-call rc()|
-select row_count()|
---disable_ps_protocol
-update t1 set data=42 where id = "b";
-select row_count()|
---enable_ps_protocol
-delete from t1|
-select row_count()|
-delete from t1|
-select row_count()|
-select * from t1|
-select row_count()|
-drop procedure rc|
-
-
-#
-# Let us test how well new locking scheme works.
-#
-
-# Let us prepare playground
---disable_warnings
-drop function if exists f0|
-drop function if exists f1|
-drop function if exists f2|
-drop function if exists f3|
-drop function if exists f4|
-drop function if exists f5|
-drop function if exists f6|
-drop function if exists f7|
-drop function if exists f8|
-drop function if exists f9|
-drop function if exists f10|
-drop function if exists f11|
-drop function if exists f12_1|
-drop function if exists f12_2|
-drop view if exists v0|
-drop view if exists v1|
-drop view if exists v2|
---enable_warnings
-delete from t1|
-delete from t2|
-insert into t1 values ("a", 1), ("b", 2) |
-insert into t2 values ("a", 1, 1.0), ("b", 2, 2.0), ("c", 3, 3.0) |
-
-# Test the simplest function using tables
-create function f1() returns int
-  return (select sum(data) from t1)|
-select f1()|
-# This should work too (and give 2 rows as result)
-select id, f1() from t1|
-
-# Function which uses two instances of table simultaneously
-create function f2() returns int
-  return (select data from t1 where data <= (select sum(data) from t1) limit 1)|
-select f2()|
-select id, f2() from t1|
-
-# Function which uses the same table twice in different queries
-create function f3() returns int
-begin
-  declare n int;
-  declare m int;
-  set n:= (select min(data) from t1);
-  set m:= (select max(data) from t1);
-  return n < m;
-end|
-select f3()|
-select id, f3() from t1|
-
-# Calling two functions using same table
-select f1(), f3()|
-select id, f1(), f3() from t1|
-
-# Function which uses two different tables
-create function f4() returns double 
-  return (select d from t1, t2 where t1.data = t2.i and t1.id= "b")|
-select f4()|
-select s, f4() from t2|
-
-# Recursive functions which due to this recursion require simultaneous
-# access to several instance of the same table won't work
-create function f5(i int) returns int
-begin
-  if i <= 0 then
-    return 0;
-  elseif i = 1  then
-    return (select count(*) from t1 where data = i);
-  else
-    return (select count(*) + f5( i - 1) from t1 where data = i);
-  end if;
-end|
-select f5(1)|
-# Since currently recursive functions are disallowed ER_SP_NO_RECURSION
-# error will be returned, once we will allow them error about
-# insufficient number of locked tables will be returned instead.
---error ER_SP_NO_RECURSION
-select f5(2)|
---error ER_SP_NO_RECURSION
-select f5(3)|
-
-# OTOH this should work 
-create function f6() returns int
-begin
-  declare n int;
-  set n:= f1();
-  return (select count(*) from t1 where data <= f7() and data <= n);
-end|
-create function f7() returns int
-  return (select sum(data) from t1 where data <= f1())|
-select f6()|
-select id, f6() from t1|
-
-#
-# Let us test how new locking work with views
-#
-# The most trivial view
-create view v1 (a) as select f1()|
-select * from v1|
-select id, a from t1, v1|
-select * from v1, v1 as v|
-# A bit more complex construction
-create view v2 (a) as select a*10 from v1|
-select * from v2|
-select id, a from t1, v2|
-select * from v1, v2|
-
-# Nice example where the same view is used on
-# on different expression levels
-create function f8 () returns int
-  return (select count(*) from v2)|
-
-select *, f8() from v1|
-
-# Let us test what will happen if function is missing
-drop function f1|
---error 1356
-select * from v1|
-
-# And what will happen if we have recursion which involves
-# views and functions ?
-create function f1() returns int
-  return (select sum(data) from t1) + (select sum(data) from v1)|
---error ER_SP_NO_RECURSION
-select f1()|
---error ER_SP_NO_RECURSION
-select * from v1|
---error ER_SP_NO_RECURSION
-select * from v2|
-# Back to the normal cases
-drop function f1|
-create function f1() returns int
-  return (select sum(data) from t1)|
-
-# Let us also test some weird cases where no real tables is used
-create function f0() returns int
-  return (select * from (select 100) as r)|
-select f0()|
-select *, f0() from (select 1) as t|
-create view v0 as select f0()|
-select * from v0|
-select *, f0() from v0|
-
-#
-# Let us test how well prelocking works with explicit LOCK TABLES.
-#
-lock tables t1 read, t1 as t11 read|
-# These should work well
-select f3()|
-select id, f3() from t1 as t11|
-# Degenerate cases work too :)
-select f0()|
-select * from v0|
-select *, f0() from v0, (select 123) as d1|
-# But these should not !
---error 1100
-select id, f3() from t1|
---error 1100
-select f4()|
-unlock tables|
-
-# Let us test how LOCK TABLES which implicitly depends on functions
-# works
-lock tables v2 read, mysql.proc read|
-select * from v2|
-select * from v1|
-# These should not work as we have too little instances of tables locked
---error 1100
-select * from v1, t1|
---error 1100
-select f4()|
-unlock tables|
-
-# Tests for handling of temporary tables in functions.
-#
-# Unlike for permanent tables we should be able to create, use
-# and drop such tables in functions.
-# 
-# Simplest function using temporary table. It is also test case for bug 
-# #12198 "Temporary table aliasing does not work inside stored functions"
-create function f9() returns int
-begin
-  declare a, b int;
-  drop temporary table if exists t3;
-  create temporary table t3 (id int);
-  insert into t3 values (1), (2), (3);
-  set a:= (select count(*) from t3);
-  set b:= (select count(*) from t3 t3_alias);
-  return a + b;
-end|
-# This will emit warning as t3 was not existing before.
-select f9()|
-select f9() from t1 limit 1|
-
-# Function which uses both temporary and permanent tables.
-create function f10() returns int
-begin
-  drop temporary table if exists t3;
-  create temporary table t3 (id int);
-  insert into t3 select id from t4;
-  return (select count(*) from t3);
-end|
-# Check that we don't ignore completely tables used in function
---error ER_NO_SUCH_TABLE
-select f10()|
-create table t4 as select 1 as id|
-select f10()|
-
-# Practical cases which we don't handle well (yet)
-#
-# Function which does not work because of well-known and documented
-# limitation of MySQL. We can't use the several instances of the
-# same temporary table in statement.
-create function f11() returns int
-begin
-  drop temporary table if exists t3;
-  create temporary table t3 (id int);
-  insert into t3 values (1), (2), (3);
-  return (select count(*) from t3 as a, t3 as b);
-end|
---error ER_CANT_REOPEN_TABLE
-select f11()|
---error ER_CANT_REOPEN_TABLE
-select f11() from t1|
-# We don't handle temporary tables used by nested functions well
-create function f12_1() returns int
-begin
-  drop temporary table if exists t3;
-  create temporary table t3 (id int);
-  insert into t3 values (1), (2), (3);
-  return f12_2();
-end|
-create function f12_2() returns int
-  return (select count(*) from t3)|
-# We need clean start to get error
-drop temporary table t3|
---error ER_NO_SUCH_TABLE
-select f12_1()|
---error ER_NO_SUCH_TABLE
-select f12_1() from t1 limit 1|
-
-# Cleanup
-drop function f0|
-drop function f1|
-drop function f2|
-drop function f3|
-drop function f4|
-drop function f5|
-drop function f6|
-drop function f7|
-drop function f8|
-drop function f9|
-drop function f10|
-drop function f11|
-drop function f12_1|
-drop function f12_2|
-drop view v0|
-drop view v1|
-drop view v2|
-delete from t1 |
-delete from t2 |
-drop table t4|
-
-# End of non-bug tests
-
-
-#
-# Some "real" examples
-#
-
-# fac
-
---disable_warnings
-drop table if exists t3|
---enable_warnings
-create table t3 (n int unsigned not null primary key, f bigint unsigned)|
-
---disable_warnings
-drop procedure if exists ifac|
---enable_warnings
-create procedure ifac(n int unsigned)
-begin
-  declare i int unsigned default 1;
-
-  if n > 20 then
-    set n = 20;		# bigint overflow otherwise
-  end if;
-  while i <= n do
-    begin
-      insert into test.t3 values (i, fac(i));
-      set i = i + 1;
-    end;
-  end while;
-end|
-
-call ifac(20)|
-select * from t3|
-drop table t3|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show function status like '%f%'|
-drop procedure ifac|
-drop function fac|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show function status like '%f%'|
-
-
-# primes
-
---disable_warnings
-drop table if exists t3|
---enable_warnings
-
-create table t3 (
-  i int unsigned not null primary key,
-  p bigint unsigned not null
-)|
-
-insert into t3 values
- ( 0,   3), ( 1,   5), ( 2,   7), ( 3,  11), ( 4,  13),
- ( 5,  17), ( 6,  19), ( 7,  23), ( 8,  29), ( 9,  31),
- (10,  37), (11,  41), (12,  43), (13,  47), (14,  53),
- (15,  59), (16,  61), (17,  67), (18,  71), (19,  73),
- (20,  79), (21,  83), (22,  89), (23,  97), (24, 101),
- (25, 103), (26, 107), (27, 109), (28, 113), (29, 127),
- (30, 131), (31, 137), (32, 139), (33, 149), (34, 151),
- (35, 157), (36, 163), (37, 167), (38, 173), (39, 179),
- (40, 181), (41, 191), (42, 193), (43, 197), (44, 199)|
-
---disable_warnings
-drop procedure if exists opp|
---enable_warnings
-create procedure opp(n bigint unsigned, out pp bool)
-begin
-  declare r double;
-  declare b, s bigint unsigned default 0;
-
-  set r = sqrt(n);
-
- again:
-  loop
-    if s = 45 then
-      set b = b+200, s = 0;
-    else
-      begin
-        declare p bigint unsigned;
-
-        select t.p into p from test.t3 t where t.i = s;
-        if b+p > r then
-          set pp = 1;
-          leave again;
-        end if;
-        if mod(n, b+p) = 0 then
-          set pp = 0;
-          leave again;
-        end if;
-        set s = s+1;
-      end;
-    end if;
-  end loop;
-end|
-
---disable_warnings
-drop procedure if exists ip|
---enable_warnings
-create procedure ip(m int unsigned)
-begin
-  declare p bigint unsigned;
-  declare i int unsigned;
-
-  set i=45, p=201;
-
-  while i < m do
-    begin
-      declare pp bool default 0;
-
-      call opp(p, pp);
-      if pp then
-        insert into test.t3 values (i, p);
-        set i = i+1;
-      end if;
-      set p = p+2;
-    end;
-  end while;
-end|
-show create procedure opp|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show procedure status like '%p%'|
-
-# This isn't the fastest way in the world to compute prime numbers, so
-# don't be too ambitious. ;-)
-call ip(200)|
-# We don't want to select the entire table here, just pick a few
-# examples.
-# The expected result is:
-#    i      p
-#   ---   ----
-#    45    211
-#   100    557
-#   199   1229
-select * from t3 where i=45 or i=100 or i=199|
-drop table t3|
-drop procedure opp|
-drop procedure ip|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show procedure status like '%p%'|
-
-
-# Fibonacci, for recursion test. (Yet Another Numerical series :)
-#
---disable_warnings
-drop table if exists t3|
---enable_warnings
-create table t3 ( f bigint unsigned not null )|
-
-# We deliberately do it the awkward way, fetching the last two
-# values from the table, in order to exercise various statements
-# and table accesses at each turn.
---disable_warnings
-drop procedure if exists fib|
---enable_warnings
-create procedure fib(n int unsigned)
-begin
-  if n > 1 then
-    begin
-      declare x, y bigint unsigned;
-      declare c cursor for select f from t3 order by f desc limit 2;
-
-      open c;
-      fetch c into y;
-      fetch c into x;
-      close c;
-      insert into t3 values (x+y);
-      call fib(n-1);
-    end;
-  end if;
-end|
-
-# Enable recursion
-set @@max_sp_recursion_depth= 20|
-
-# Minimum test: recursion of 3 levels
-
-insert into t3 values (0), (1)|
-
-call fib(3)|
-
-select * from t3 order by f asc|
-
-delete from t3|
-
-# The original test, 20 levels, ran into memory limits on some machines
-# and builds. Try 10 instead...
-
-insert into t3 values (0), (1)|
-
-call fib(10)|
-
-select * from t3 order by f asc|
-drop table t3|
-drop procedure fib|
-set @@max_sp_recursion_depth= 0|
-
-#
-# Comment & suid
-#
-
---disable_warnings
-drop procedure if exists bar|
---enable_warnings
-create procedure bar(x char(16), y int)
- comment "111111111111" sql security invoker
- insert into test.t1 values (x, y)|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show procedure status like 'bar'|
-alter procedure bar comment "2222222222" sql security definer|
-alter procedure bar comment "3333333333"|
-alter procedure bar|
-show create procedure bar|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-show procedure status like 'bar'|
-drop procedure bar|
-
-#
-# rexecution
-#
---disable_warnings
-drop procedure if exists p1|
---enable_warnings
-create procedure p1 ()
-  select (select s1 from t3) from t3|
-
-create table t3 (s1 int)|
-
-call p1()|
-insert into t3 values (1)|
-call p1()|
-drop procedure p1|
-drop table t3|
-
-#
-# backticks
-#
---disable_warnings
-drop function if exists foo|
---enable_warnings
-create function `foo` () returns int
-  return 5|
-select `foo` ()|
-drop function `foo`|
-
-#
-# Implicit LOCK/UNLOCK TABLES for table access in functions
-#
-
---disable_warnings
-drop function if exists t1max|
---enable_warnings
-create function t1max() returns int
-begin
-  declare x int;
-  select max(data) into x from t1;
-  return x;
-end|
-
-insert into t1 values ("foo", 3), ("bar", 2), ("zip", 5), ("zap", 1)|
-select t1max()|
-drop function t1max|
-
-create table t3 (
-  v char(16) not null primary key,
-  c int unsigned not null
-)|
-
-create function getcount(s char(16)) returns int
-begin
-  declare x int;
-
-  select count(*) into x from t3 where v = s;
-  if x = 0 then
-    insert into t3 values (s, 1);
-  else
-    update t3 set c = c+1 where v = s;
-  end if;
-  return x;
-end|
-
-select * from t1 where data = getcount("bar")|
-select * from t3|
-select getcount("zip")|
-select getcount("zip")|
-select * from t3|
-select getcount(id) from t1 where data = 3|
-select getcount(id) from t1 where data = 5|
-select * from t3|
-drop table t3|
-drop function getcount|
-
-
-# Test cases for different combinations of condition handlers in nested
-# begin-end blocks in stored procedures.
-#
-# Note that the standard specifies that the most specific handler should
-# be triggered even if it's an outer handler masked by a less specific
-# handler in an inner block.
-# Note also that '02000' is more specific than NOT FOUND; there might be
-# other '02xxx' states, even if we currently do not issue them in any
-# situation (e.g. '02001').
-#
-# The combinations we test are these:
-#
-#                                         Inner
-#              errcode      sqlstate     not found    sqlwarning   sqlexception
-#  Outer      +------------+------------+------------+------------+------------+
-#errcode      | h_ee (i)   | h_es (o)   | h_en (o)   | h_ew (o)   | h_ex (o)   |
-#sqlstate     | h_se (i)   | h_ss (i)   | h_sn (o)   | h_sw (o)   | h_sx (o)   |
-#not found    | h_ne (i)   | h_ns (i)   | h_nn (i)   |            |            |
-#sqlwarning   | h_we (i)   | h_ws (i)   |            | h_ww (i)   |            |
-#sqlexception | h_xe (i)   | h_xs (i)   |            |            | h_xx (i)   |
-#             +------------+---------------------------------------------------+
-#
-# (i) means that the inner handler is the one that should be invoked,
-# (o) means that the outer handler should be invoked.
-#
-# ('not found', 'sqlwarning' and 'sqlexception' are mutually exclusive, hence
-#  no tests for those combinations.)
-#
-
---disable_warnings
-drop table if exists t3|
-drop procedure if exists h_ee|
-drop procedure if exists h_es|
-drop procedure if exists h_en|
-drop procedure if exists h_ew|
-drop procedure if exists h_ex|
-drop procedure if exists h_se|
-drop procedure if exists h_ss|
-drop procedure if exists h_sn|
-drop procedure if exists h_sw|
-drop procedure if exists h_sx|
-drop procedure if exists h_ne|
-drop procedure if exists h_ns|
-drop procedure if exists h_nn|
-drop procedure if exists h_we|
-drop procedure if exists h_ws|
-drop procedure if exists h_ww|
-drop procedure if exists h_xe|
-drop procedure if exists h_xs|
-drop procedure if exists h_xx|
---enable_warnings
-
-# smallint    - to get out of range warnings
-# primary key - to get constraint errors
-create table t3 (a smallint primary key)|
-
-insert into t3 (a) values (1)|
-
-create procedure h_ee()
-    deterministic
-begin
-  declare continue handler for 1062 -- ER_DUP_ENTRY
-    select 'Outer (bad)' as 'h_ee';
-
-  begin
-    declare continue handler for 1062 -- ER_DUP_ENTRY
-        select 'Inner (good)' as 'h_ee';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_es()
-    deterministic
-begin
-  declare continue handler for 1062 -- ER_DUP_ENTRY
-    select 'Outer (good)' as 'h_es';
-
-  begin
-    -- integrity constraint violation
-    declare continue handler for sqlstate '23000'
-      select 'Inner (bad)' as 'h_es';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_en()
-    deterministic
-begin
-  declare continue handler for 1329 -- ER_SP_FETCH_NO_DATA
-    select 'Outer (good)' as 'h_en';
-
-  begin
-    declare x int;
-    declare continue handler for sqlstate '02000' -- no data
-      select 'Inner (bad)' as 'h_en';
-
-    select a into x from t3 where a = 42;
-  end;
-end|
-
-create procedure h_ew()
-    deterministic
-begin
-  declare continue handler for 1264 -- ER_WARN_DATA_OUT_OF_RANGE
-    select 'Outer (good)' as 'h_ew';
-
-  begin
-    declare continue handler for sqlwarning
-      select 'Inner (bad)' as 'h_ew';
-
-    insert into t3 values (123456789012);
-  end;
-  delete from t3;
-  insert into t3 values (1);
-end|
-
-create procedure h_ex()
-    deterministic
-begin
-  declare continue handler for 1062 -- ER_DUP_ENTRY
-    select 'Outer (good)' as 'h_ex';
-
-  begin
-    declare continue handler for sqlexception
-      select 'Inner (bad)' as 'h_ex';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_se()
-    deterministic
-begin
-  -- integrity constraint violation
-  declare continue handler for sqlstate '23000' 
-    select 'Outer (bad)' as 'h_se';
-
-  begin
-    declare continue handler for 1062 -- ER_DUP_ENTRY
-      select 'Inner (good)' as 'h_se';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_ss()
-    deterministic
-begin
-  -- integrity constraint violation
-  declare continue handler for sqlstate '23000' 
-    select 'Outer (bad)' as 'h_ss';
-
-  begin
-    -- integrity constraint violation
-    declare continue handler for sqlstate '23000' 
-      select 'Inner (good)' as 'h_ss';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_sn()
-    deterministic
-begin
-  -- Note: '02000' is more specific than NOT FOUND ;
-  --       there might be other not found states 
-  declare continue handler for sqlstate '02000' -- no data
-    select 'Outer (good)' as 'h_sn';
-
-  begin
-    declare x int;
-    declare continue handler for not found
-      select 'Inner (bad)' as 'h_sn';
-
-    select a into x from t3 where a = 42;
-  end;
-end|
-
-create procedure h_sw()
-    deterministic
-begin
-  -- data exception - numeric value out of range
-  declare continue handler for sqlstate '22003'
-    select 'Outer (good)' as 'h_sw';
-
-  begin
-    declare continue handler for sqlwarning
-      select 'Inner (bad)' as 'h_sw';
-
-    insert into t3 values (123456789012);
-  end;
-  delete from t3;
-  insert into t3 values (1);
-end|
-
-create procedure h_sx()
-    deterministic
-begin
-  -- integrity constraint violation
-  declare continue handler for sqlstate '23000' 
-    select 'Outer (good)' as 'h_sx';
-
-  begin
-    declare continue handler for sqlexception
-      select 'Inner (bad)' as 'h_sx';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_ne()
-    deterministic
-begin
-  declare continue handler for not found
-    select 'Outer (bad)' as 'h_ne';
-
-  begin
-    declare x int;
-    declare continue handler for 1329 -- ER_SP_FETCH_NO_DATA
-      select 'Inner (good)' as 'h_ne';
-
-    select a into x from t3 where a = 42;
-  end;
-end|
-
-create procedure h_ns()
-    deterministic
-begin
-  declare continue handler for not found
-    select 'Outer (bad)' as 'h_ns';
-
-  begin
-    declare x int;
-    declare continue handler for sqlstate '02000' -- no data
-      select 'Inner (good)' as 'h_ns';
-
-    select a into x from t3 where a = 42;
-  end;
-end|
-
-create procedure h_nn()
-    deterministic
-begin
-  declare continue handler for not found
-    select 'Outer (bad)' as 'h_nn';
-
-  begin
-    declare x int;
-    declare continue handler for not found
-      select 'Inner (good)' as 'h_nn';
-
-    select a into x from t3 where a = 42;
-  end;
-end|
-
-create procedure h_we()
-    deterministic
-begin
-  declare continue handler for sqlwarning
-    select 'Outer (bad)' as 'h_we';
-
-  begin
-    declare continue handler for 1264 -- ER_WARN_DATA_OUT_OF_RANGE
-      select 'Inner (good)' as 'h_we';
-
-    insert into t3 values (123456789012);
-  end;
-  delete from t3;
-  insert into t3 values (1);
-end|
-
-create procedure h_ws()
-    deterministic
-begin
-  declare continue handler for sqlwarning
-    select 'Outer (bad)' as 'h_ws';
-
-  begin
-    -- data exception - numeric value out of range
-    declare continue handler for sqlstate '22003'
-      select 'Inner (good)' as 'h_ws';
-
-    insert into t3 values (123456789012);
-  end;
-  delete from t3;
-  insert into t3 values (1);
-end|
-
-create procedure h_ww()
-    deterministic
-begin
-  declare continue handler for sqlwarning
-    select 'Outer (bad)' as 'h_ww';
-
-  begin
-    declare continue handler for sqlwarning
-      select 'Inner (good)' as 'h_ww';
-
-    insert into t3 values (123456789012);
-  end;
-  delete from t3;
-  insert into t3 values (1);
-end|
-
-create procedure h_xe()
-    deterministic
-begin
-  declare continue handler for sqlexception
-    select 'Outer (bad)' as 'h_xe';
-
-  begin
-    declare continue handler for 1062 -- ER_DUP_ENTRY
-      select 'Inner (good)' as 'h_xe';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_xs()
-    deterministic
-begin
-  declare continue handler for sqlexception
-    select 'Outer (bad)' as 'h_xs';
-
-  begin
-    -- integrity constraint violation
-    declare continue handler for sqlstate '23000'
-      select 'Inner (good)' as 'h_xs';
-
-    insert into t3 values (1);
-  end;
-end|
-
-create procedure h_xx()
-    deterministic
-begin
-  declare continue handler for sqlexception
-    select 'Outer (bad)' as 'h_xx';
-
-  begin
-    declare continue handler for sqlexception
-      select 'Inner (good)' as 'h_xx';
-
-    insert into t3 values (1);
-  end;
-end|
-
-call h_ee()|
-call h_es()|
-call h_en()|
-call h_ew()|
-call h_ex()|
-call h_se()|
-call h_ss()|
-call h_sn()|
-call h_sw()|
-call h_sx()|
-call h_ne()|
-call h_ns()|
-call h_nn()|
-call h_we()|
-call h_ws()|
-call h_ww()|
-call h_xe()|
-call h_xs()|
-call h_xx()|
-
-drop table t3|
-drop procedure h_ee|
-drop procedure h_es|
-drop procedure h_en|
-drop procedure h_ew|
-drop procedure h_ex|
-drop procedure h_se|
-drop procedure h_ss|
-drop procedure h_sn|
-drop procedure h_sw|
-drop procedure h_sx|
-drop procedure h_ne|
-drop procedure h_ns|
-drop procedure h_nn|
-drop procedure h_we|
-drop procedure h_ws|
-drop procedure h_ww|
-drop procedure h_xe|
-drop procedure h_xs|
-drop procedure h_xx|
-
-
-#
-# Test cases for old bugs
-#
-
-#
-# BUG#822
-#
---disable_warnings
-drop procedure if exists bug822|
---enable_warnings
-create procedure bug822(a_id char(16), a_data int)
-begin
-  declare n int;
-  select count(*) into n from t1 where id = a_id and data = a_data;
-  if n = 0 then
-    insert into t1 (id, data) values (a_id, a_data);
-  end if;
-end|
-
-delete from t1|
-call bug822('foo', 42)|
-call bug822('foo', 42)|
-call bug822('bar', 666)|
-select * from t1|
-delete from t1|
-drop procedure bug822|
-
-#
-# BUG#1495
-#
---disable_warnings
-drop procedure if exists bug1495|
---enable_warnings
-create procedure bug1495()
-begin
-  declare x int;
-
-  select data into x from t1 order by id limit 1;
-  if x > 10 then
-    insert into t1 values ("less", x-10);
-  else
-    insert into t1 values ("more", x+10);
-  end if;
-end|
-
-insert into t1 values ('foo', 12)|
-call bug1495()|
-delete from t1 where id='foo'|
-insert into t1 values ('bar', 7)|
-call bug1495()|
-delete from t1 where id='bar'|
-select * from t1|
-delete from t1|
-drop procedure bug1495|
-
-#
-# BUG#1547
-#
---disable_warnings
-drop procedure if exists bug1547|
---enable_warnings
-create procedure bug1547(s char(16))
-begin
-  declare x int;
-
-  select data into x from t1 where s = id limit 1;
-  if x > 10 then
-    insert into t1 values ("less", x-10);
-  else
-    insert into t1 values ("more", x+10);
-  end if;
-end|
-
-insert into t1 values ("foo", 12), ("bar", 7)|
-call bug1547("foo")|
-call bug1547("bar")|
-select * from t1|
-delete from t1|
-drop procedure bug1547|
-
-#
-# BUG#1656
-#
---disable_warnings
-drop table if exists t70|
---enable_warnings
-create table t70 (s1 int,s2 int)|
-insert into t70 values (1,2)|
-
---disable_warnings
-drop procedure if exists bug1656|
---enable_warnings
-create procedure bug1656(out p1 int, out p2 int)
-  select * into p1, p1 from t70|
-
-call bug1656(@1, @2)|
-select @1, @2|
-drop table t70|
-drop procedure bug1656|
-
-#
-# BUG#1862
-#
-create table t3(a int)|
-
---disable_warnings
-drop procedure if exists bug1862|
---enable_warnings
-create procedure bug1862()
-begin
-  insert into t3 values(2);    
-  flush tables;
-end|
-
-call bug1862()|
-# the second call caused a segmentation
-call bug1862()|
-select * from t3|
-drop table t3|
-drop procedure bug1862|
-
-#
-# BUG#1874
-#
---disable_warnings
-drop procedure if exists bug1874|
---enable_warnings
-create procedure bug1874()
-begin
-  declare x int;
-  declare y double;
-  select max(data) into x from t1;
-  insert into t2 values ("max", x, 0);
-  select min(data) into x from t1;
-  insert into t2 values ("min", x, 0);
-  select sum(data) into x from t1;
-  insert into t2 values ("sum", x, 0);
-  select avg(data) into y from t1;
-  insert into t2 values ("avg", 0, y);
-end|
-
-insert into t1 (data) values (3), (1), (5), (9), (4)|
-call bug1874()|
-select * from t2|
-delete from t1|
-delete from t2|
-drop procedure bug1874|
-
-#
-# BUG#2260
-#
---disable_warnings
-drop procedure if exists bug2260|
---enable_warnings
-create procedure bug2260()
-begin
-  declare v1 int;
-  declare c1 cursor for select data from t1;
-  declare continue handler for not found set @x2 = 1;
-
-  open c1;
-  fetch c1 into v1;
-  set @x2 = 2;
-  close c1;
-end|
-
-call bug2260()|
-select @x2|
-drop procedure bug2260|
-
-#
-# BUG#2267 "Lost connect if stored procedure has SHOW FUNCTION STATUS"
-#
---disable_warnings
-drop procedure if exists bug2267_1|
---enable_warnings
-create procedure bug2267_1()
-begin
-  show procedure status;
-end|
-
---disable_warnings
-drop procedure if exists bug2267_2|
---enable_warnings
-create procedure bug2267_2()
-begin
-  show function status;
-end|
-
---disable_warnings
-drop procedure if exists bug2267_3|
---enable_warnings
-create procedure bug2267_3()
-begin
-  show create procedure bug2267_1;
-end|
-
---disable_warnings
-drop procedure if exists bug2267_4|
-drop function if exists bug2267_4|
---enable_warnings
-create procedure bug2267_4()
-begin
-  show create function bug2267_4;
-end|
-create function bug2267_4() returns int return 100|
-
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-call bug2267_1()|
---replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
-call bug2267_2()|
-call bug2267_3()|
-call bug2267_4()|
-
-drop procedure bug2267_1|
-drop procedure bug2267_2|
-drop procedure bug2267_3|
-drop procedure bug2267_4|
-drop function bug2267_4|
-
-#
-# BUG#2227
-#
---disable_warnings
-drop procedure if exists bug2227|
---enable_warnings
-create procedure bug2227(x int)
-begin
-  declare y float default 2.6;
-  declare z char(16) default "zzz";
-
-  select 1.3, x, y, 42, z;
-end|
-
-call bug2227(9)|
-drop procedure bug2227|
-
-#
-# BUG#2614 "Stored procedure with INSERT ... SELECT that does not
-#           contain any tables crashes server"
-#
---disable_warnings
-drop procedure if exists bug2614|
---enable_warnings
-create procedure bug2614()
-begin
-  drop table if exists t3;
-  create table t3 (id int default '0' not null);
-  insert into t3 select 12;
-  insert into t3 select * from t3;
-end|
-
---disable_warnings
-call bug2614()|
---enable_warnings
-call bug2614()|
-drop table t3|
-drop procedure bug2614|
-
-#
-# BUG#2674
-#
---disable_warnings
-drop function if exists bug2674|
---enable_warnings
-create function bug2674() returns int
-  return @@sort_buffer_size|
-
-set @osbs = @@sort_buffer_size|
-set @@sort_buffer_size = 262000|
-select bug2674()|
-drop function bug2674|
-set @@sort_buffer_size = @osbs|
-
-#
-# BUG#3259
-#
---disable_warnings
-drop procedure if exists bug3259_1 |
---enable_warnings
-create procedure bug3259_1 () begin end|
---disable_warnings
-drop procedure if exists BUG3259_2 |
---enable_warnings
-create procedure BUG3259_2 () begin end|
---disable_warnings
-drop procedure if exists Bug3259_3 |
---enable_warnings
-create procedure Bug3259_3 () begin end|
-
-call BUG3259_1()|
-call BUG3259_1()|
-call bug3259_2()|
-call Bug3259_2()|
-call bug3259_3()|
-call bUG3259_3()|
-
-drop procedure bUg3259_1|
-drop procedure BuG3259_2|
-drop procedure BUG3259_3|
-
-#
-# BUG#2772
-#
---disable_warnings
-drop function if exists bug2772|
---enable_warnings
-create function bug2772() returns char(10) character set latin2
-  return 'a'|
-
-select bug2772()|
-drop function bug2772|
-
-#
-# BUG#2776
-#
---disable_warnings
-drop procedure if exists bug2776_1|
---enable_warnings
-create procedure bug2776_1(out x int)
-begin
-  declare v int;
-
-  set v = default;
-  set x = v;
-end|
-
---disable_warnings
-drop procedure if exists bug2776_2|
---enable_warnings
-create procedure bug2776_2(out x int)
-begin
-  declare v int default 42;
-
-  set v = default;
-  set x = v;
-end|
-
-set @x = 1|
-call bug2776_1(@x)|
-select @x|
-call bug2776_2(@x)|
-select @x|
-drop procedure bug2776_1|
-drop procedure bug2776_2|
-
-#
-# BUG#2780
-#
-create table t3 (s1 smallint)|
-
-insert into t3 values (123456789012)|
-
---disable_warnings
-drop procedure if exists bug2780|
---enable_warnings
-create procedure bug2780()
-begin
-  declare exit handler for sqlwarning set @x = 1; 
-
-  set @x = 0;
-  insert into t3 values (123456789012);
-  insert into t3 values (0);
-end|
-
-call bug2780()|
-select @x|
-select * from t3|
-
-drop procedure bug2780|
-drop table t3|
-
-#
-# BUG#1863
-#
-create table t3 (content varchar(10) )|
-insert into t3 values ("test1")|
-insert into t3 values ("test2")|
-create table t4 (f1 int, rc int, t3 int)|
-
---disable_warnings
-drop procedure if exists bug1863|
---enable_warnings
-create procedure bug1863(in1 int)
-begin 
-
-  declare ind int default 0;
-  declare t1 int;
-  declare t2 int;
-  declare t3 int;
-
-  declare rc int default 0;
-  declare continue handler for 1065 set rc = 1;
-
-  drop temporary table if exists temp_t1;
-  create temporary table temp_t1 (
-    f1 int auto_increment, f2 varchar(20), primary key (f1)
-  );
-
-  insert into temp_t1 (f2) select content from t3;
-
-  select f2 into t3 from temp_t1 where f1 = 10;
-
-  if (rc) then
-       insert into t4 values (1, rc, t3);
-  end if;
-
-  insert into t4 values (2, rc, t3);
-
-end|
-
-call bug1863(10)|
-call bug1863(10)|
-select * from t4|
-
-drop procedure bug1863|
-drop temporary table temp_t1;
-drop table t3, t4|
-
-#
-# BUG#2656
-#
-
-create table t3 ( 
-  OrderID  int not null,
-  MarketID int,
-  primary key (OrderID)
-)|
-
-create table t4 ( 
-  MarketID int not null,
-  Market varchar(60),
-  Status char(1),
-  primary key (MarketID)
-)|
-
-insert t3 (OrderID,MarketID) values (1,1)|
-insert t3 (OrderID,MarketID) values (2,2)|
-insert t4 (MarketID,Market,Status) values (1,"MarketID One","A")|
-insert t4 (MarketID,Market,Status) values (2,"MarketID Two","A")|
-
---disable_warnings
-drop procedure if exists bug2656_1|
---enable_warnings
-create procedure bug2656_1()
-begin 
-  select
-    m.Market
-  from  t4 m JOIN t3 o 
-        ON o.MarketID != 1 and o.MarketID = m.MarketID;
-end |
-
---disable_warnings
-drop procedure if exists bug2656_2|
---enable_warnings
-create procedure bug2656_2()
-begin 
-  select
-    m.Market
-  from  
-    t4 m, t3 o
-  where       
-    m.MarketID != 1 and m.MarketID = o.MarketID;
-        
-end |
-
-call bug2656_1()|
-call bug2656_1()|
-call bug2656_2()|
-call bug2656_2()|
-drop procedure bug2656_1|
-drop procedure bug2656_2|
-drop table t3, t4|
-
-
-#
-# BUG#3426
-#
---disable_warnings
-drop procedure if exists bug3426|
---enable_warnings
-create procedure bug3426(in_time int unsigned, out x int)
-begin
-  if in_time is null then
-    set @stamped_time=10;
-    set x=1;
-  else
-    set @stamped_time=in_time;
-    set x=2;
-  end if;
-end|
-
-call bug3426(1000, @i)|
-select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time|
-call bug3426(NULL, @i)|
-select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time|
-# Clear SP cache
-alter procedure bug3426 sql security invoker|
-call bug3426(NULL, @i)|
-select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time|
-call bug3426(1000, @i)|
-select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time|
-
-drop procedure bug3426|
-
-#
-# BUG#3448
-#
---disable_warnings
-create table t3 (
-  a int primary key, 
-  ach char(1)
-) engine = innodb|
-
-create table t4 (
-  b int  primary key , 
-  bch char(1)
-) engine = innodb|
---enable_warnings
-
-insert into t3 values (1 , 'aCh1' ) , ('2' , 'aCh2')|
-insert into t4 values (1 , 'bCh1' )|
-
---disable_warnings
-drop procedure if exists bug3448|
---enable_warnings
-create procedure bug3448()
-  select * from t3 inner join t4 on t3.a = t4.b|
-
-select * from t3 inner join t4 on t3.a = t4.b|
-call bug3448()|
-call bug3448()|
-
-drop procedure bug3448|
-drop table t3, t4|
-
-
-#
-# BUG#3734
-#
-create table t3 (
-  id int unsigned auto_increment not null primary key,
-  title VARCHAR(200),
-  body text,
-  fulltext (title,body)
-)|
-
-insert into t3 (title,body) values
-  ('MySQL Tutorial','DBMS stands for DataBase ...'),
-  ('How To Use MySQL Well','After you went through a ...'),
-  ('Optimizing MySQL','In this tutorial we will show ...'),
-  ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-  ('MySQL vs. YourSQL','In the following database comparison ...'),
-  ('MySQL Security','When configured properly, MySQL ...')|
-
---disable_warnings
-drop procedure if exists bug3734 |
---enable_warnings
-create procedure bug3734 (param1 varchar(100))
-  select * from t3 where match (title,body) against (param1)|
-
-call bug3734('database')|
-call bug3734('Security')|
-
-drop procedure bug3734|
-drop table t3|
-
-#
-# BUG#3863
-#
---disable_warnings
-drop procedure if exists bug3863|
---enable_warnings
-create procedure bug3863()
-begin
-  set @a = 0;
-  while @a < 5 do
-    set @a = @a + 1;
-  end while;
-end|
-
-call bug3863()|
-select @a|
-call bug3863()|
-select @a|
-
-drop procedure bug3863|
-
-#
-# BUG#2460
-#
-
-create table t3 (
-  id int(10) unsigned not null default 0,
-  rid int(10) unsigned not null default 0,
-  msg text not null,
-  primary key (id),
-  unique key rid (rid, id)
-)|
-
---disable_warnings
-drop procedure if exists bug2460_1|
---enable_warnings
-create procedure bug2460_1(in v int)
-begin
-    ( select n0.id from t3 as n0 where n0.id = v )
-  union
-    ( select n0.id from t3 as n0, t3 as n1
-        where n0.id = n1.rid and n1.id = v )
-  union
-    ( select n0.id from t3 as n0, t3 as n1, t3 as n2
-        where n0.id = n1.rid and n1.id = n2.rid and n2.id = v );
-end|
-
-call bug2460_1(2)|
-call bug2460_1(2)|
-insert into t3 values (1, 1, 'foo'), (2, 1, 'bar'), (3, 1, 'zip zap')|
-call bug2460_1(2)|
-call bug2460_1(2)|
-
---disable_warnings
-drop procedure if exists bug2460_2|
---enable_warnings
-create procedure bug2460_2()
-begin
-  drop table if exists t3;
-  create temporary table t3 (s1 int);
-  insert into t3 select 1 union select 1;
-end|
-
-call bug2460_2()|
-call bug2460_2()|
-select * from t3|
-
-drop procedure bug2460_1|
-drop procedure bug2460_2|
-drop table t3|
-
-
-#
-# BUG#2564
-#
-set @@sql_mode = ''|
---disable_warnings
-drop procedure if exists bug2564_1|
---enable_warnings
-create procedure bug2564_1()
-    comment 'Joe''s procedure'
-  insert into `t1` values ("foo", 1)|
-
-set @@sql_mode = 'ANSI_QUOTES'|
---disable_warnings
-drop procedure if exists bug2564_2|
---enable_warnings
-create procedure bug2564_2()
-  insert into "t1" values ('foo', 1)|
-
-delimiter $|
-set @@sql_mode = ''$
---disable_warnings
-drop function if exists bug2564_3$
---enable_warnings
-create function bug2564_3(x int, y int) returns int
-  return x || y$
-
-set @@sql_mode = 'ANSI'$
---disable_warnings
-drop function if exists bug2564_4$
---enable_warnings
-create function bug2564_4(x int, y int) returns int
-  return x || y$
-delimiter |$
-
-set @@sql_mode = ''|
-show create procedure bug2564_1|
-show create procedure bug2564_2|
-show create function bug2564_3|
-show create function bug2564_4|
-
-drop procedure bug2564_1|
-drop procedure bug2564_2|
-drop function bug2564_3|
-drop function bug2564_4|
-
-#
-# BUG#3132
-#
---disable_warnings
-drop function if exists bug3132|
---enable_warnings
-create function bug3132(s char(20)) returns char(50)
-  return concat('Hello, ', s, '!')|
-
-select bug3132('Bob') union all select bug3132('Judy')|
-drop function bug3132|
-
-#
-# BUG#3843
-#
---disable_warnings
-drop procedure if exists bug3843|
---enable_warnings
-create procedure bug3843()
-  analyze table t1|
-
-# Testing for packets out of order
-call bug3843()|
-call bug3843()|
-select 1+2|
-
-drop procedure bug3843|
-
-#
-# BUG#3368
-#
-create table t3 ( s1 char(10) )|
-insert into t3 values ('a'), ('b')|
-
---disable_warnings
-drop procedure if exists bug3368|
---enable_warnings
-create procedure bug3368(v char(10))
-begin
-  select group_concat(v) from t3;
-end|
-
-call bug3368('x')|
-call bug3368('yz')|
-drop procedure bug3368|
-drop table t3|
-
-#
-# BUG#4579
-#
-create table t3 (f1 int, f2 int)|
-insert into t3 values (1,1)|
-
---disable_warnings
-drop procedure if exists bug4579_1|
---enable_warnings
-create procedure bug4579_1 ()
-begin
-  declare sf1 int;
-
-  select f1 into sf1 from t3 where f1=1 and f2=1;
-  update t3 set f2 = f2 + 1 where f1=1 and f2=1;
-  call bug4579_2();
-end|
-
---disable_warnings
-drop procedure if exists bug4579_2|
---enable_warnings
-create procedure bug4579_2 ()
-begin
-end|
-
-call bug4579_1()|
-call bug4579_1()|
-call bug4579_1()|
-
-drop procedure bug4579_1|
-drop procedure bug4579_2|
-drop table t3|
-
-#
-# BUG#2773: Function's data type ignored in stored procedures
-#
---disable_warnings
-drop procedure if exists bug2773|
---enable_warnings
-
-create function bug2773() returns int return null|
-create table t3 as select bug2773()|
-show create table t3|
-drop table t3|
-drop function bug2773|
-
-#
-# BUG#3788: Stored procedure packet error
-#
---disable_warnings
-drop procedure if exists bug3788|
---enable_warnings
-
-create function bug3788() returns date return cast("2005-03-04" as date)|
-select bug3788()|
-drop function bug3788|
-
-create function bug3788() returns binary(1) return 5|
-select bug3788()|
-drop function bug3788|
- 
-
-#
-# BUG#4726
-#
-create table t3 (f1 int, f2 int, f3 int)|
-insert into t3 values (1,1,1)|
-
---disable_warnings
-drop procedure if exists bug4726|
---enable_warnings
-create procedure bug4726()
-begin
-   declare tmp_o_id INT;
-   declare tmp_d_id INT default 1;
-
-   while tmp_d_id <= 2 do
-   begin
-     select f1 into tmp_o_id from t3 where f2=1 and f3=1;
-     set tmp_d_id = tmp_d_id + 1;
-   end;
-   end while;
-end|
-
-call bug4726()|
-call bug4726()|
-call bug4726()|
-
-drop procedure bug4726|
-drop table t3|
-
-#
-# BUG#4318
-#
-
---disable_parsing # Don't know if HANDLER commands can work with SPs, or at all..
-create table t3 (s1 int)|
-insert into t3 values (3), (4)|
-
---disable_warnings
-drop procedure if exists bug4318|
---enable_warnings
-create procedure bug4318()
-  handler t3 read next|
-
-handler t3 open|
-# Expect no results, as tables are closed, but there shouldn't be any errors
-call bug4318()|
-call bug4318()|
-handler t3 close|
-
-drop procedure bug4318|
-drop table t3|
---enable_parsing
-
-#
-# BUG#4902: Stored procedure with SHOW WARNINGS leads to packet error
-#
-# Added tests for most other show commands we could find too.
-# (Skipping those already tested, and the ones depending on optional handlers.)
-#
-# Note: This will return a large number of results of different formats,
-#       which makes it impossible to filter with --replace_column.
-#       It's possible that some of these are not deterministic across
-#       platforms. If so, just remove the offending command.
-#
---disable_warnings
-drop procedure if exists bug4902|
---enable_warnings
-create procedure bug4902()
-begin
-  show charset like 'foo';
-  show collation like 'foo';
-  show column types;
-  show create table t1;
-  show create database test;
-  show databases like 'foo';
-  show errors;
-  show columns from t1;
-  show grants for 'root'@'localhost';
-  show keys from t1;
-  show open tables like 'foo';
-  show privileges;
-  show status like 'foo';
-  show tables like 'foo';
-  show variables like 'foo';
-  show warnings;
-end|
---disable_parsing
-show binlog events;
-show storage engines;
-show master status;
-show slave hosts;
-show slave status;
---enable_parsing
-
-call bug4902()|
-call bug4902()|
-
-drop procedure bug4902|
-
-# We need separate SP for SHOW PROCESSLIST  since we want use replace_column
---disable_warnings
-drop procedure if exists bug4902_2|
---enable_warnings
-create procedure bug4902_2()
-begin
-  show processlist;
-end|
---replace_column 1 # 6 # 3 localhost
-call bug4902_2()|
---replace_column 1 # 6 # 3 localhost
-call bug4902_2()|
-drop procedure bug4902_2|
-
-#
-# BUG#4904
-#
---disable_warnings
-drop procedure if exists bug4904|
---enable_warnings
-create procedure bug4904()
-begin
-  declare continue handler for sqlstate 'HY000' begin end;
-
-  create table t2 as select * from t3;
-end|
-
--- error 1146
-call bug4904()|
-
-drop procedure bug4904|
-
-create table t3 (s1 char character set latin1, s2 char character set latin2)|
-
---disable_warnings
-drop procedure if exists bug4904|
---enable_warnings
-create procedure bug4904 ()
-begin
-  declare continue handler for sqlstate 'HY000' begin end;
-
-  select s1 from t3 union select s2 from t3; 
-end|
-
-call bug4904()|
-
-drop procedure bug4904|
-drop table t3|
-
-#
-# BUG#336
-#
---disable_warnings
-drop procedure if exists bug336|
---enable_warnings
-create procedure bug336(out y int)
-begin
-  declare x int;
-  set x = (select sum(t.data) from test.t1 t);
-  set y = x;
-end|
-
-insert into t1 values ("a", 2), ("b", 3)|
-call bug336(@y)|
-select @y|
-delete from t1|
-drop procedure bug336|
-
-#
-# BUG#3157
-#
---disable_warnings
-drop procedure if exists bug3157|
---enable_warnings
-create procedure bug3157()
-begin
-  if exists(select * from t1) then
-    set @n= @n + 1;
-  end if;
-  if (select count(*) from t1) then
-    set @n= @n + 1;
-  end if;
-end|
-
-set @n = 0|
-insert into t1 values ("a", 1)|
-call bug3157()|
-select @n|
-delete from t1|
-drop procedure bug3157|
-
-#
-# BUG#5251: mysql changes creation time of a procedure/function when altering
-#
---disable_warnings
-drop procedure if exists bug5251|
---enable_warnings
-create procedure bug5251()
-begin
-end|
-
-select created into @c1 from mysql.proc
-  where db='test' and name='bug5251'|
---sleep 2
-alter procedure bug5251 comment 'foobar'|
-select count(*) from mysql.proc
-  where  db='test' and name='bug5251' and created = @c1|
-
-drop procedure bug5251|
-
-#
-# BUG#5279: Stored procedure packets out of order if CHECKSUM TABLE
-#
---disable_warnings
-drop procedure if exists bug5251|
---enable_warnings
-create procedure bug5251()
-  checksum table t1|
-
-call bug5251()|
-call bug5251()|
-drop procedure bug5251|
-
-#
-# BUG#5287: Stored procedure crash if leave outside loop
-#
---disable_warnings
-drop procedure if exists bug5287|
---enable_warnings
-create procedure bug5287(param1 int)
-label1:
-  begin
-    declare c cursor for select 5;
-
-    loop
-      if param1 >= 0 then
-        leave label1;
-      end if;
-    end loop;
-end|
-call bug5287(1)|
-drop procedure bug5287|
-
-
-#
-# BUG#5307: Stored procedure allows statement after BEGIN ... END
-#
---disable_warnings
-drop procedure if exists bug5307|
---enable_warnings
-create procedure bug5307()
-begin
-end; set @x = 3|
-
-call bug5307()|
-select @x|
-drop procedure bug5307|
-
-#
-# BUG#5258: Stored procedure modified date is 0000-00-00
-# (This was a design flaw)
---disable_warnings
-drop procedure if exists bug5258|
---enable_warnings
-create procedure bug5258()
-begin
-end|
-
---disable_warnings
-drop procedure if exists bug5258_aux|
---enable_warnings
-create procedure bug5258_aux()
-begin
-  declare c, m char(19);
-
-  select created,modified into c,m from mysql.proc where name = 'bug5258';
-  if c = m then
-    select 'Ok';
-  else
-    select c, m;
-  end if;
-end|
-
-call bug5258_aux()|
-
-drop procedure bug5258|
-drop procedure bug5258_aux|
-
-#
-# BUG#4487: Stored procedure connection aborted if uninitialized char
-#
---disable_warnings
-drop function if exists bug4487|
---enable_warnings
-create function bug4487() returns char
-begin
-  declare v char;
-  return v;
-end|
-
-select bug4487()|
-drop function bug4487|
-
-
-#
-# BUG#4941: Stored procedure crash fetching null value into variable.
-#
---disable_warnings
-drop procedure if exists bug4941|
---enable_warnings
---disable_warnings
-drop procedure if exists bug4941|
---enable_warnings
-create procedure bug4941(out x int)
-begin
-  declare c cursor for select i from t2 limit 1;
-  open c;
-  fetch c into x;
-  close c;
-end|
-
-insert into t2 values (null, null, null)|
-set @x = 42|
-call bug4941(@x)|
-select @x|
-delete from t1|
-drop procedure bug4941|
-
-
-#
-# BUG#3583: query cache doesn't work for stored procedures
-#
---disable_warnings
-drop procedure if exists bug3583|
---enable_warnings
---disable_warnings
-drop procedure if exists bug3583|
---enable_warnings
-create procedure bug3583()
-begin
-  declare c int;
-
-  select * from t1;
-  select count(*) into c from t1;
-  select c;
-end|
-
-insert into t1 values ("x", 3), ("y", 5)|
-set @x = @@query_cache_size|
-set global query_cache_size = 10*1024*1024|
-
-flush status|
-flush query cache|
-show status like 'Qcache_hits'|
-call bug3583()|
-show status like 'Qcache_hits'|
-call bug3583()|
-call bug3583()|
-show status like 'Qcache_hits'|
-
-set global query_cache_size = @x|
-flush status|
-flush query cache|
-delete from t1|
-drop procedure bug3583|
-
-#
-# BUG#4905: Stored procedure doesn't clear for "Rows affected"
-#
---disable_warnings
-drop procedure if exists bug4905|
---enable_warnings
-
-create table t3 (s1 int,primary key (s1))|
-
---disable_warnings
-drop procedure if exists bug4905|
---enable_warnings
-create procedure bug4905()
-begin
-  declare v int;
-  declare continue handler for sqlstate '23000' set v = 5;
-
-  insert into t3 values (1);
-end|
-
-call bug4905()|
-select row_count()|
-call bug4905()|
-select row_count()|
-call bug4905()|
-select row_count()|
-select * from t3|
-
-drop procedure bug4905|
-drop table t3|
-
-#
-# BUG#6022: Stored procedure shutdown problem with self-calling function.
-#
-
---disable_parsing # until we implement support for recursive stored functions.
---disable_warnings
-drop function if exists bug6022|
---enable_warnings
-
---disable_warnings
-drop function if exists bug6022|
---enable_warnings
-create function bug6022(x int) returns int
-begin
-  if x < 0 then
-    return 0;
-  else
-    return bug6022(x-1);
-  end if;
-end|
-
-select bug6022(5)|
-drop function bug6022|
---enable_parsing
-
-#
-# BUG#6029: Stored procedure specific handlers should have priority
-#
---disable_warnings
-drop procedure if exists bug6029|
---enable_warnings
-
---disable_warnings
-drop procedure if exists bug6029|
---enable_warnings
-create procedure bug6029()
-begin
-  declare exit handler for 1136  select '1136';
-  declare exit handler for sqlstate '23000'  select 'sqlstate 23000';
-  declare continue handler for sqlexception  select 'sqlexception';
-
-  insert into t3 values (1);
-  insert into t3 values (1,2);
-end|
- 
-create table t3 (s1 int, primary key (s1))|
-insert into t3 values (1)|
-call bug6029()|
-delete from t3|
-call bug6029()|
-
-drop procedure bug6029|
-drop table t3|
-
-#
-# BUG#8540: Local variable overrides an alias
-#
---disable_warnings
-drop procedure if exists bug8540|
---enable_warnings
-
-create procedure bug8540()
-begin
-  declare x int default 1;
-  select x as y, x+0 as z;
-end|
-
-call bug8540()|
-drop procedure bug8540|
-
-#
-# BUG#6642: Stored procedure crash if expression with set function
-#
-create table t3 (s1 int)|
-
---disable_warnings
-drop procedure if exists bug6642|
---enable_warnings
-
-create procedure bug6642()
-  select abs(count(s1)) from t3|
-
-call bug6642()|
-call bug6642()|
-drop procedure bug6642|
-
-#
-# BUG#7013: Stored procedure crash if group by ... with rollup
-#
-insert into t3 values (0),(1)|
---disable_warnings
-drop procedure if exists bug7013|
---enable_warnings
-create procedure bug7013()
-  select s1,count(s1) from t3 group by s1 with rollup|
-call bug7013()|
-call bug7013()|
-drop procedure bug7013|
-
-#
-# BUG#7743: 'Lost connection to MySQL server during query' on Stored Procedure
-#
---disable_warnings
-drop table if exists t4|
---enable_warnings
-create table t4 (
-  a mediumint(8) unsigned not null auto_increment,
-  b smallint(5) unsigned not null,
-  c char(32) not null,
-  primary key  (a)
-) engine=myisam default charset=latin1|
-insert into t4 values (1, 2, 'oneword')|
-insert into t4 values (2, 2, 'anotherword')|
-
---disable_warnings
-drop procedure if exists bug7743|
---enable_warnings
-create procedure bug7743 ( searchstring char(28) )
-begin
-  declare var mediumint(8) unsigned;
-  select a into var from t4 where b = 2 and c = binary searchstring limit 1;
-  select var;
-end|
-
-call bug7743("oneword")|
-call bug7743("OneWord")|
-call bug7743("anotherword")|
-call bug7743("AnotherWord")|
-drop procedure bug7743|
-drop table t4|
-
-#
-# BUG#7992: SELECT .. INTO variable .. within Stored Procedure crashes
-#           the server
-#
-delete from t3|
-insert into t3 values(1)|
-drop procedure if exists bug7992_1|
-drop procedure if exists bug7992_2|
-create procedure bug7992_1()
-begin
-  declare i int;
-  select max(s1)+1 into i from t3;
-end|
-create procedure bug7992_2()
-  insert into t3 (s1) select max(t4.s1)+1 from t3 as t4|
-
-call bug7992_1()|
-call bug7992_1()|
-call bug7992_2()|
-call bug7992_2()|
-
-drop procedure bug7992_1|
-drop procedure bug7992_2|
-drop table t3|
-
-#
-# BUG#8116: calling simple stored procedure twice in a row results
-#           in server crash
-#
-create table t3 (  userid bigint(20) not null default 0 )|
-
---disable_warnings
-drop procedure if exists bug8116|
---enable_warnings
-create procedure bug8116(in _userid int)
-   select * from t3 where userid = _userid|
-
-call bug8116(42)|
-call bug8116(42)|
-drop procedure bug8116|
-drop table t3|
-
-#
-# BUG#6857: current_time() in STORED PROCEDURES
-#
---disable_warnings
-drop procedure if exists bug6857|
---enable_warnings
-create procedure bug6857(counter int)
-begin
-  declare t0, t1 int;
-  declare plus bool default 0;
-
-  set t0 = current_time();
-  while counter > 0 do
-    set counter = counter - 1;
-  end while;
-  set t1 = current_time();
-  if t1 > t0 then
-    set plus = 1;
-  end if;
-  select plus;
-end|
-
-# QQ: This is currently disabled. Not only does it slow down a normal test
-#     run, it makes running with valgrind (or similar tools) extremely
-#     painful.
-# Make sure this takes at least one second on all machines in all builds.
-# 30000 makes it about 3 seconds on an old 1.1GHz linux.
-#call bug6857(300000)|
-
-drop procedure bug6857|
-
-#
-# BUG#8757: Stored Procedures: Scope of Begin and End Statements do not
-#           work properly.
---disable_warnings
-drop procedure if exists bug8757|
---enable_warnings
-create procedure bug8757()
-begin
-  declare x int;
-  declare c1 cursor for select data from t1 limit 1;
-
-  begin
-    declare y int;
-    declare c2 cursor for select i from t2 limit 1;
-
-    open c2;
-    fetch c2 into y;
-    close c2;
-    select 2,y;
-  end;
-  open c1;
-  fetch c1 into x;
-  close c1;
-  select 1,x;
-end|
-
-delete from t1|
-delete from t2|
-insert into t1 values ("x", 1)|
-insert into t2 values ("y", 2, 0.0)|
-
-call bug8757()|
-
-delete from t1|
-delete from t2|
-drop procedure bug8757|
-
-
-#
-# BUG#8762: Stored Procedures: Inconsistent behavior
-#           of DROP PROCEDURE IF EXISTS statement.
---disable_warnings
-drop procedure if exists bug8762|
---enable_warnings
-# Doesn't exist
-drop procedure if exists bug8762; create procedure bug8762() begin end|
-# Does exist
-drop procedure if exists bug8762; create procedure bug8762() begin end|
-drop procedure bug8762|
-
-
-#
-# BUG#5240: Stored procedure crash if function has cursor declaration
-#
---disable_warnings
-drop function if exists bug5240|
---enable_warnings
-create function bug5240 () returns int
-begin
-  declare x int;
-  declare c cursor for select data from t1 limit 1;
-
-  open c;
-  fetch c into x;
-  close c;
-  return x;
-end|
-
-delete from t1|
-insert into t1 values ("answer", 42)|
-select id, bug5240() from t1|
-drop function bug5240|
-
-#
-# BUG#5278: Stored procedure packets out of order if SET PASSWORD.
-#
---disable_warnings
-drop function if exists bug5278|
---enable_warnings
-create function bug5278 () returns char
-begin
-  SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
-  return 'okay';
-end|
-
---error 1133
-select bug5278()|
---error 1133
-select bug5278()|
-drop function bug5278|
-
-#
-# BUG#7992: rolling back temporary Item tree changes in SP
-#
---disable_warnings
-drop procedure if exists p1|
---enable_warnings
-create table t3(id int)|
-insert into t3 values(1)|
-create procedure bug7992()
-begin
-  declare i int;
-  select max(id)+1 into i from t3;
-end|
-
-call bug7992()|
-call bug7992()|
-drop procedure bug7992|
-drop table t3|
-delimiter ;|
-
-#
-# BUG#8849: problem with insert statement with table alias's
-#
-# Rolling back changes to AND/OR structure of ON and WHERE clauses  in SP
-# 
-
-delimiter |;
-create table t3 (
-  lpitnumber int(11) default null,
-  lrecordtype int(11) default null
-)|
-
-create table t4 (
-  lbsiid int(11) not null default '0',
-  ltradingmodeid int(11) not null default '0',
-  ltradingareaid int(11) not null default '0',
-  csellingprice decimal(19,4) default null,
-  primary key  (lbsiid,ltradingmodeid,ltradingareaid)
-)|
-
-create table t5 (
-  lbsiid int(11) not null default '0',
-  ltradingareaid int(11) not null default '0',
-  primary key  (lbsiid,ltradingareaid)
-)|
-
---disable_warnings
-drop procedure if exists bug8849|
---enable_warnings
-create procedure bug8849()
-begin
-  insert into t5
-  (
-   t5.lbsiid,
-   t5.ltradingareaid
-  )
-  select distinct t3.lpitnumber, t4.ltradingareaid
-  from
-    t4 join t3 on
-      t3.lpitnumber = t4.lbsiid
-      and t3.lrecordtype = 1
-    left join t4 as price01 on
-      price01.lbsiid = t4.lbsiid and
-      price01.ltradingmodeid = 1 and
-      t4.ltradingareaid = price01.ltradingareaid;
-end|
-
-call bug8849()|
-call bug8849()|
-call bug8849()|
-drop procedure bug8849|
-drop tables t3,t4,t5|
-
-#
-# BUG#8937: Stored Procedure: AVG() works as SUM() in SELECT ... INTO statement
-#
---disable_warnings
-drop procedure if exists bug8937|
---enable_warnings
-create procedure bug8937()
-begin
-  declare s,x,y,z int;
-  declare a float;
-
-  select sum(data),avg(data),min(data),max(data) into s,x,y,z from t1;
-  select s,x,y,z;
-  select avg(data) into a from t1;
-  select a;
-end|
-
-delete from t1|
-insert into t1 (data) values (1), (2), (3), (4), (6)|
-call bug8937()|
-
-drop procedure bug8937|
-delete from t1|
-
-
-#
-# BUG#6900: Stored procedure inner handler ignored
-# BUG#9074: STORED PROC: The scope of every handler declared is not
-#                        properly applied
-#
---disable_warnings
-drop procedure if exists bug6900|
-drop procedure if exists bug9074|
-drop procedure if exists bug6900_9074|
---enable_warnings
-
-create table t3 (w char unique, x char)|
-insert into t3 values ('a', 'b')|
-
-create procedure bug6900()
-begin
-  declare exit handler for sqlexception select '1';
-
-  begin
-    declare exit handler for sqlexception select '2';
-
-    insert into t3 values ('x', 'y', 'z');
-  end;
-end|
-
-create procedure bug9074()
-begin
-  declare x1, x2, x3, x4, x5, x6 int default 0;
-
-  begin    
-    declare continue handler for sqlstate '23000' set x5 = 1;      
-
-    insert into t3 values ('a', 'b');      
-    set x6 = 1;      
-  end;
-
- begin1_label:
-  begin
-    declare continue handler for sqlstate '23000' set x1 = 1;      
-
-    insert into t3 values ('a', 'b');      
-    set x2 = 1;      
-				
-   begin2_label:
-    begin  
-      declare exit handler for sqlstate '23000' set x3 = 1;         
-
-      set x4= 1;         
-      insert into t3 values ('a','b');
-      set x4= 0;
-    end begin2_label;
-  end begin1_label;
-
-  select x1, x2, x3, x4, x5, x6;
-end|
-
-create procedure bug6900_9074(z int)
-begin
-  declare exit handler for sqlstate '23000' select '23000';
-
-  begin
-    declare exit handler for sqlexception select 'sqlexception';
-
-    if z = 1 then
-      insert into t3 values ('a', 'b');
-    else
-      insert into t3 values ('x', 'y', 'z');
-    end if;
-  end;
-end|
-
-call bug6900()|
-call bug9074()|
-call bug6900_9074(0)|
-call bug6900_9074(1)|
-
-drop procedure bug6900|
-drop procedure bug9074|
-drop procedure bug6900_9074|
-drop table t3|
-
-
-#
-# BUG#7185: Stored procedure crash if identifier is AVG
-#
---disable_warnings
-drop procedure if exists avg|
---enable_warnings
-create procedure avg ()
-begin
-end|
-
-call avg ()|
-drop procedure avg|
-
-
-#
-# BUG#6129: Stored procedure won't display @@sql_mode value
-#
---disable_warnings
-drop procedure if exists bug6129|
---enable_warnings
-set @old_mode= @@sql_mode;
-set @@sql_mode= "ERROR_FOR_DIVISION_BY_ZERO";
-create procedure bug6129()
-  select @@sql_mode|
-call bug6129()|
-set @@sql_mode= "NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO"|
-call bug6129()|
-set @@sql_mode= "NO_ZERO_IN_DATE"|
-call bug6129()|
-set @@sql_mode=@old_mode;
-
-drop procedure bug6129|
-
-
-#
-# BUG#9856: Stored procedures: crash if handler for sqlexception, not found
-#
---disable_warnings
-drop procedure if exists bug9856|
---enable_warnings
-create procedure bug9856()
-begin
-  declare v int;
-  declare c cursor for select data from t1;
-  declare exit handler for sqlexception, not found select '16';
-
-  open c;
-  fetch c into v;
-  select v;
-end|
-
-delete from t1|
-call bug9856()|
-call bug9856()|
-drop procedure bug9856|
-
-
-#
-# BUG##9674: Stored Procs: Using declared vars in algebric operation causes
-#            system crash.
-#
---disable_warnings
-drop procedure if exists bug9674_1|
-drop procedure if exists bug9674_2|
---enable_warnings
-create procedure bug9674_1(out arg int)
-begin
-  declare temp_in1 int default 0;
-  declare temp_fl1 int default 0;
-
-  set temp_in1 = 100;
-  set temp_fl1 = temp_in1/10;
-  set arg = temp_fl1;
-end|
-
-create procedure bug9674_2()
-begin
-  declare v int default 100;
-
-  select v/10;
-end|
-
-call bug9674_1(@sptmp)|
-call bug9674_1(@sptmp)|
-select @sptmp|
-call bug9674_2()|
-call bug9674_2()|
-drop procedure bug9674_1|
-drop procedure bug9674_2|
-
-
-#
-# BUG#9598: stored procedure call within stored procedure overwrites IN variable
-#
---disable_warnings
-drop procedure if exists bug9598_1|
-drop procedure if exists bug9598_2|
---enable_warnings
-create procedure bug9598_1(in var_1 char(16),
-                           out var_2 integer, out var_3 integer)
-begin
-  set var_2 = 50;
-  set var_3 = 60;
-end|
-
-create procedure bug9598_2(in v1 char(16),
-                           in v2 integer,
-                           in v3 integer,
-                           in v4 integer,
-                           in v5 integer)
-begin
-  select v1,v2,v3,v4,v5;
-  call bug9598_1(v1,@tmp1,@tmp2);
-  select v1,v2,v3,v4,v5;
-end|
-
-call bug9598_2('Test',2,3,4,5)|
-select @tmp1, @tmp2|
-
-drop procedure bug9598_1|
-drop procedure bug9598_2|
-
-
-#
-# BUG#9902: Crash with simple stored function using user defined variables
-#
---disable_warnings
-drop procedure if exists bug9902|
---enable_warnings
-create function bug9902() returns int(11)
-begin
-  set @x = @x + 1;
-  return @x;
-end|
-
-set @qcs1 = @@query_cache_size|
-set global query_cache_size = 100000|
-set @x = 1|
-insert into t1 values ("qc", 42)|
-select bug9902() from t1|
-select bug9902() from t1|
-select @x|
-
-set global query_cache_size = @qcs1|
-delete from t1|
-drop function bug9902|
-
-
-#
-# BUG#9102: Stored proccedures: function which returns blob causes crash
-#
---disable_warnings
-drop function if exists bug9102|
---enable_warnings
-create function bug9102() returns blob return 'a'|
-select bug9102()|
-drop function bug9102|
-
-
-#
-# BUG#7648: Stored procedure crash when invoking a function that returns a bit
-#
---disable_warnings
-drop function if exists bug7648|
---enable_warnings
-create function bug7648() returns bit(8) return 'a'|
-select bug7648()|
-drop function bug7648|
-
-
-#
-# BUG#9775: crash if create function that returns enum or set
-#
---disable_warnings
-drop function if exists bug9775|
---enable_warnings
-create function bug9775(v1 char(1)) returns enum('a','b') return v1|
-select bug9775('a'),bug9775('b'),bug9775('c')|
-drop function bug9775|
-create function bug9775(v1 int) returns enum('a','b') return v1|
-select bug9775(1),bug9775(2),bug9775(3)|
-drop function bug9775|
-
-create function bug9775(v1 char(1)) returns set('a','b') return v1|
-select bug9775('a'),bug9775('b'),bug9775('a,b'),bug9775('c')|
-drop function bug9775|
-create function bug9775(v1 int) returns set('a','b') return v1|
-select bug9775(1),bug9775(2),bug9775(3),bug9775(4)|
-drop function bug9775|
-
-
-#
-# BUG#8861: If Return is a YEAR data type, value is not shown in year format
-#
---disable_warnings
-drop function if exists bug8861|
---enable_warnings
-create function bug8861(v1 int) returns year return v1|
-select bug8861(05)|
-set @x = bug8861(05)|
-select @x|
-drop function bug8861|
-
-
-#
-# BUG#9004: Inconsistent behaviour of SP re. warnings
-#
---disable_warnings
-drop procedure if exists bug9004_1|
-drop procedure if exists bug9004_2|
---enable_warnings
-create procedure bug9004_1(x char(16))
-begin
-  insert into t1 values (x, 42);
-  insert into t1 values (x, 17);
-end|
-create procedure bug9004_2(x char(16))
-  call bug9004_1(x)|
-
-# Truncation warnings expected...
-call bug9004_1('12345678901234567')|
-call bug9004_2('12345678901234567890')|
-
-delete from t1|
-drop procedure bug9004_1|
-drop procedure bug9004_2|
-
-#
-# BUG#7293: Stored procedure crash with soundex
-#
---disable_warnings
-drop procedure if exists bug7293|
---enable_warnings
-insert into t1 values ('secret', 0)| 
-create procedure bug7293(p1 varchar(100))
-begin
-  if exists (select id from t1 where soundex(p1)=soundex(id)) then
-    select 'yes';
-  end if;
-end;| 
-call bug7293('secret')| 
-call bug7293 ('secrete')| 
-drop procedure bug7293|
-delete from t1|
-
-
-#
-# BUG#9841: Unexpected read lock when trying to update a view in a
-#           stored procedure
-#
---disable_warnings
-drop procedure if exists bug9841|
-drop view if exists v1|
---enable_warnings
-
-create view v1 as select * from t1, t2 where id = s|
-create procedure bug9841 ()
-  update v1 set data = 10| 
-call bug9841()|
-
-drop view v1|
-drop procedure bug9841|
-
-
-#
-# BUG#5963 subqueries in SET/IF
-#
---disable_warnings
-drop procedure if exists bug5963|
---enable_warnings
-
-create procedure bug5963_1 () begin declare v int; set v = (select s1 from t3); select v; end;|
-create table t3 (s1 int)|
-insert into t3 values (5)|
-call bug5963_1()|
-call bug5963_1()|
-drop procedure bug5963_1|
-drop table t3|
-
-create procedure bug5963_2 (cfk_value int) 
-begin 
-  if cfk_value in (select cpk from t3) then 
-    set @x = 5; 
-  end if; 
-  end; 
-| 
-create table t3 (cpk int)| 
-insert into t3 values (1)| 
-call bug5963_2(1)|
-call bug5963_2(1)|
-drop procedure bug5963_2|
-drop table t3|
-
-
-#
-# BUG#9559: Functions: Numeric Operations using -ve value gives incorrect
-#           results.
-#
---disable_warnings
-drop function if exists bug9559|
---enable_warnings
-create function bug9559()
-  returns int
-begin
-  set @y = -6/2;
-  return @y;
-end|
-
-select bug9559()|
-
-drop function bug9559|
-
-
-#
-# BUG#10961: Stored procedures: crash if select * from dual
-#
---disable_warnings
-drop procedure if exists bug10961|
---enable_warnings
-# "select * from dual" results in an error, so the cursor will not open
-create procedure bug10961()
-begin
-  declare v char;
-  declare x int;
-  declare c cursor for select * from dual;
-  declare continue handler for sqlexception select x;
-
-  set x = 1;
-  open c;
-  set x = 2;
-  fetch c into v;
-  set x = 3;
-  close c;
-end|
-
-call bug10961()|
-call bug10961()|
-
-drop procedure bug10961|
-
-#
-# BUG #6866: Second call of a stored procedure using a view with on expressions
-#
-
---disable_warnings
-DROP PROCEDURE IF EXISTS bug6866|
---enable_warnings
-
-DROP VIEW IF EXISTS tv|
-DROP TABLE IF EXISTS tt1,tt2,tt3|
-
-CREATE TABLE tt1 (a1 int, a2 int, a3 int, data varchar(10))|
-CREATE TABLE tt2 (a2 int, data2 varchar(10))|
-CREATE TABLE tt3 (a3 int, data3 varchar(10))|
-
-INSERT INTO tt1 VALUES (1, 1, 4, 'xx')|
-
-INSERT INTO tt2 VALUES (1, 'a')|
-INSERT INTO tt2 VALUES (2, 'b')|
-INSERT INTO tt2 VALUES (3, 'c')|
-
-INSERT INTO tt3 VALUES (4, 'd')|
-INSERT INTO tt3 VALUES (5, 'e')|
-INSERT INTO tt3 VALUES (6, 'f')|
-
-CREATE VIEW tv AS
-SELECT tt1.*, tt2.data2, tt3.data3
-  FROM tt1 INNER JOIN tt2 ON tt1.a2 = tt2.a2
-         LEFT JOIN tt3 ON tt1.a3 = tt3.a3
-    ORDER BY tt1.a1, tt2.a2, tt3.a3|
-
-CREATE PROCEDURE bug6866 (_a1 int)
-BEGIN
-SELECT * FROM tv WHERE a1 = _a1;
-END|
-
-CALL bug6866(1)|
-CALL bug6866(1)|
-CALL bug6866(1)|
-
-DROP PROCEDURE bug6866;
-
-DROP VIEW tv|
-DROP TABLE tt1, tt2, tt3|
-
-#
-# BUG#10136: items cleunup
-#
---disable_warnings
-DROP PROCEDURE IF EXISTS bug10136|
---enable_warnings
-create table t3 ( name char(5) not null primary key, val float not null)|
-insert into t3 values ('aaaaa', 1), ('bbbbb', 2), ('ccccc', 3)|
-create procedure bug10136()
-begin
-  declare done int default 3;
-
-  repeat
-    select * from t3;
-    set done = done - 1;
-  until done <= 0 end repeat;
-
-end|
-call bug10136()|
-call bug10136()|
-call bug10136()|
-drop procedure bug10136|
-drop table t3|
-
-#
-# BUG#11529: crash server after use stored procedure
-#
---disable_warnings
-drop procedure if exists bug11529|
---enable_warnings
-create procedure bug11529()
-begin
-  declare c cursor for select id, data from t1 where data in (10,13);
-
-  open c;
-  begin
-    declare vid char(16);
-    declare vdata int;
-    declare exit handler for not found begin end;
-
-    while true do
-      fetch c into vid, vdata;
-    end while;
-  end;
-  close c;
-end|
-
-insert into t1 values
-  ('Name1', 10),
-  ('Name2', 11),
-  ('Name3', 12),
-  ('Name4', 13),
-  ('Name5', 14)|
-
-call bug11529()|
-call bug11529()|
-delete from t1|
-drop procedure bug11529|
-
-
-#
-# BUG#6063: Stored procedure labels are subject to restrictions (partial)
-# BUG#7088: Stored procedures: labels won't work if character set is utf8
-#
---disable_warnings
-drop procedure if exists bug6063|
-drop procedure if exists bug7088_1|
-drop procedure if exists bug7088_2|
---enable_warnings
-
---disable_parsing # temporarily disabled until Bar fixes BUG#11986
-create procedure bug6063()
-  lâbel: begin end|
-call bug6063()|
-# QQ Known bug: this will not show the label correctly.
-show create procedure bug6063|
-
-set character set utf8|
-create procedure bug7088_1()
-  label1: begin end label1|
-create procedure bug7088_2()
-  läbel1: begin end|
-call bug7088_1()|
-call bug7088_2()|
-set character set default|
-show create procedure bug7088_1|
-show create procedure bug7088_2|
-
-drop procedure bug6063|
-drop procedure bug7088_1|
-drop procedure bug7088_2|
---enable_parsing
-
-#
-# BUG#9565: "Wrong locking in stored procedure if a sub-sequent procedure
-#           is called".
-#
---disable_warnings
-drop procedure if exists bug9565_sub|
-drop procedure if exists bug9565|
---enable_warnings
-create procedure bug9565_sub()
-begin
-  select * from t1;
-end|
-create procedure bug9565()
-begin
-  insert into t1 values ("one", 1);
-  call bug9565_sub();
-end|
-call bug9565()|
-delete from t1|
-drop procedure bug9565_sub|
-drop procedure bug9565|
-
-
-#
-# BUG#9538: SProc: Creation fails if we try to SET system variable
-#           using @@var_name in proc
-#
---disable_warnings
-drop procedure if exists bug9538|
---enable_warnings
-create procedure bug9538()
-  set @@sort_buffer_size = 1000000|
-
-set @x = @@sort_buffer_size|
-set @@sort_buffer_size = 2000000|
-select @@sort_buffer_size|
-call bug9538()|
-select @@sort_buffer_size|
-set @@sort_buffer_size = @x|
-
-drop procedure bug9538|
-
-
-#
-# BUG#8692: Cursor fetch of empty string
-#
---disable_warnings
-drop procedure if exists bug8692|
---enable_warnings
-create table t3 (c1 varchar(5), c2 char(5), c3 enum('one','two'), c4 text, c5 blob, c6 char(5), c7 varchar(5))|
-insert into t3 values ('', '', '', '', '', '', NULL)|
-
-create procedure bug8692()
-begin 
-    declare v1 VARCHAR(10); 
-    declare v2 VARCHAR(10); 
-    declare v3 VARCHAR(10); 
-    declare v4 VARCHAR(10); 
-    declare v5 VARCHAR(10); 
-    declare v6 VARCHAR(10); 
-    declare v7 VARCHAR(10); 
-    declare c8692 cursor for select c1,c2,c3,c4,c5,c6,c7 from t3; 
-    open c8692; 
-    fetch c8692 into v1,v2,v3,v4,v5,v6,v7;
-    select v1, v2, v3, v4, v5, v6, v7;
-end|
-
-call bug8692()|
-drop procedure bug8692|
-drop table t3|
-
-#
-# Bug#10055 "Using stored function with information_schema causes empty
-#            result set"
-#
---disable_warnings
-drop function if exists bug10055|
---enable_warnings
-create function bug10055(v char(255)) returns char(255) return lower(v)|
-# This select should not crash server and should return all fields in t1
-select t.column_name, bug10055(t.column_name)
-from information_schema.columns as t
-where t.table_schema = 'test' and t.table_name = 't1'|
-drop function bug10055|
-
-#
-# Bug #12297 "SP crashes the server if data inserted inside a lon loop"
-# The test for memleak bug, so actually there is no way to test it
-# from the suite. The test below could be used to check SP memory
-# consumption by passing large input parameter.
-#
-
---disable_warnings
-drop procedure if exists bug12297|
---enable_warnings
-
-create procedure bug12297(lim int)
-begin
-  set @x = 0;
-  repeat
-    insert into t1(id,data)
-    values('aa', @x);
-    set @x = @x + 1;
-  until @x >= lim
-  end repeat;
-end|
-
-call bug12297(10)|
-drop procedure bug12297|
-
-#
-# Bug #11247 "Stored procedures: Function calls in long loops leak memory"
-# One more memleak bug test. One could use this test to check that the memory
-# isn't leaking by increasing the input value for p_bug11247.
-#
-
---disable_warnings
-drop function if exists f_bug11247|
-drop procedure if exists p_bug11247|
---enable_warnings
-
-create function f_bug11247(param int)
-  returns int
-return param + 1|
-
-create procedure p_bug11247(lim int)
-begin
-  declare v int default 0;
-
-  while v < lim do
-    set v= f_bug11247(v);
-  end while;
-end|
-
-call p_bug11247(10)|
-drop function f_bug11247|
-drop procedure p_bug11247|
-#
-# BUG#12168: "'DECLARE CONTINUE HANDLER FOR NOT FOUND ...' in conditional
-# handled incorrectly"
-#
---disable_warnings
-drop procedure if exists bug12168|
-drop table if exists t3, t4|
---enable_warnings
-
-create table t3 (a int)|
-insert into t3 values (1),(2),(3),(4)|
-
-create table t4 (a int)|
-
-create procedure bug12168(arg1 char(1))
-begin
-  declare b, c integer;
-  if arg1 = 'a' then
-    begin
-      declare c1 cursor for select a from t3 where a % 2;
-      declare continue handler for not found set b = 1;
-      set b = 0;
-      open c1;
-      c1_repeat: repeat
-        fetch c1 into c;
-        if (b = 1) then
-          leave c1_repeat;
-        end if;
-
-        insert into t4 values (c);
-        until b = 1
-      end repeat;
-    end;
-  end if;
-  if arg1 = 'b' then
-    begin
-      declare c2 cursor for select a from t3 where not a % 2;
-      declare continue handler for not found set b = 1;
-      set b = 0;
-      open c2;
-      c2_repeat: repeat
-        fetch c2 into c;
-        if (b = 1) then
-          leave c2_repeat;
-        end if;
-
-        insert into t4 values (c);
-        until b = 1
-      end repeat;
-    end;
-  end if;
-end|
-
-call bug12168('a')|
-select * from t4|
-truncate t4|
-call bug12168('b')|
-select * from t4|
-truncate t4|
-call bug12168('a')|
-select * from t4|
-truncate t4|
-call bug12168('b')|
-select * from t4|
-truncate t4|
-drop table t3, t4|
-drop procedure if exists bug12168|
-
-#
-# Bug #11333 "Stored Procedure: Memory blow up on repeated SELECT ... INTO
-# query"
-# One more memleak bug. Use the test to check memory consumption.
-#
-
---disable_warnings
-drop table if exists t3|
-drop procedure if exists bug11333|
---enable_warnings
-
-create table t3 (c1 char(128))|
-
-insert into t3 values 
-  ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')|
-
-
-create procedure bug11333(i int)
-begin
-    declare tmp varchar(128);
-    set @x = 0;
-    repeat
-        select c1 into tmp from t3
-          where c1 = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
-        set @x = @x + 1;
-        until @x >= i
-    end repeat;
-end|
-
-call bug11333(10)|
-
-drop procedure bug11333|
-drop table t3|
-
-#
-# BUG#9048: Creating a function with char binary IN parameter fails
-#
---disable_warnings
-drop function if exists bug9048|
---enable_warnings
-create function bug9048(f1 char binary) returns char binary
-begin
-  set f1= concat( 'hello', f1 );
-  return f1;
-end|
-drop function bug9048|
-
-# Bug #12849 Stored Procedure: Crash on procedure call with CHAR type
-# 'INOUT' parameter
-#
-
---disable_warnings
-drop procedure if exists bug12849_1|
---enable_warnings
-create procedure bug12849_1(inout x char) select x into x|
-set @var='a'|
-call bug12849_1(@var)|
-select @var|
-drop procedure bug12849_1|
-
---disable_warnings
-drop procedure if exists bug12849_2|
---enable_warnings
-create procedure bug12849_2(inout foo varchar(15))
-begin
-select concat(foo, foo) INTO foo;
-end|
-set @var='abcd'|
-call bug12849_2(@var)|
-select @var|
-drop procedure bug12849_2|
-
-#
-# BUG#13133: Local variables in stored procedures are not initialized correctly.
-#
---disable_warnings
-drop procedure if exists bug131333|
-drop function if exists bug131333|
---enable_warnings
-create procedure bug131333()
-begin
-  begin
-    declare a int;
-
-    select a;
-    set a = 1;
-    select a;
-  end;
-  begin
-    declare b int;
-
-    select b;
-  end;
-end|
-
-create function bug131333()
-  returns int
-begin
-  begin
-    declare a int;
-
-    set a = 1;
-  end;
-  begin
-    declare b int;
-
-    return b;
-  end;
-end|
-
-call bug131333()|
-select bug131333()|
-
-drop procedure bug131333|
-drop function bug131333|
-
-#
-# BUG#12379: PROCEDURE with HANDLER calling FUNCTION with error get
-#            strange result
-#
---disable_warnings
-drop function if exists bug12379|
-drop procedure if exists bug12379_1|
-drop procedure if exists bug12379_2|
-drop procedure if exists bug12379_3|
-drop table if exists t3|
---enable_warnings
-
-create table t3 (c1 char(1) primary key not null)|
-
-create function bug12379()
-  returns integer
-begin
-   insert into t3 values('X');
-   insert into t3 values('X');
-   return 0;
-end|
-
-create procedure bug12379_1()
-begin
-   declare exit handler for sqlexception select 42;
-
-   select bug12379();
-END|
-create procedure bug12379_2()
-begin
-   declare exit handler for sqlexception begin end;
-
-   select bug12379();
-end|
-create procedure bug12379_3()
-begin
-   select bug12379();
-end|
-
---error 1062
-select bug12379()|
-select 1|
-call bug12379_1()|
-select 2|
-call bug12379_2()|
-select 3|
---error 1062
-call bug12379_3()|
-select 4|
-
-drop function bug12379|
-drop procedure bug12379_1|
-drop procedure bug12379_2|
-drop procedure bug12379_3|
-drop table t3|
-
-#
-# Bug #13124    Stored Procedure using SELECT INTO crashes server
-#
-
---disable_warnings
-drop procedure if exists bug13124|
---enable_warnings
-create procedure bug13124()
-begin
-  declare y integer;
-  set @x=y;
-end|
-call bug13124()|
-drop procedure  bug13124|
-
-#
-# Bug #12979  Stored procedures: crash if inout decimal parameter
-#
-
-# check NULL inout parameters processing
-
---disable_warnings
-drop procedure if exists bug12979_1|
---enable_warnings
-create procedure bug12979_1(inout d decimal(5)) set d = d / 2|
-set @bug12979_user_var = NULL|
-call bug12979_1(@bug12979_user_var)|
-drop procedure bug12979_1|
-
-# check NULL local variables processing
-
---disable_warnings
-drop procedure if exists bug12979_2|
---enable_warnings
-create procedure bug12979_2()
-begin
-declare internal_var decimal(5);
-set internal_var= internal_var / 2;
-select internal_var;
-end|
-call bug12979_2()|
-drop procedure bug12979_2|
-
-
-#
-# BUG#6127: Stored procedure handlers within handlers don't work
-#
---disable_warnings
-drop table if exists t3|
-drop procedure if exists bug6127|
---enable_warnings
-create table t3 (s1 int unique)|
-
-set @sm=@@sql_mode|
-set sql_mode='traditional'|
-
-create procedure bug6127()
-begin
-  declare continue handler for sqlstate '23000'
-    begin
-      declare continue handler for sqlstate '22003'
-        insert into t3 values (0);
-
-      insert into t3 values (1000000000000000);
-    end;
-
-  insert into t3 values (1);
-  insert into t3 values (1);
-end|
-
-call bug6127()|
-select * from t3|
---error ER_DUP_ENTRY
-call bug6127()|
-select * from t3|
-set sql_mode=@sm|
-drop table t3|
-drop procedure bug6127|
-
-
-#
-# BUG#12589: Assert when creating temp. table from decimal stored procedure
-#            variable
-#
---disable_warnings
-drop procedure if exists bug12589_1|
-drop procedure if exists bug12589_2|
-drop procedure if exists bug12589_3|
---enable_warnings
-create procedure bug12589_1()
-begin
-  declare spv1 decimal(3,3);
-  set spv1= 123.456;
-
-  set spv1 = 'test';
-  create temporary table tm1 as select spv1;
-  show create table tm1;
-  drop temporary table tm1;
-end|
-
-create procedure bug12589_2()
-begin
-  declare spv1 decimal(6,3);
-  set spv1= 123.456;
-
-  create temporary table tm1 as select spv1;
-  show create table tm1;
-  drop temporary table tm1;
-end|
-
-create procedure bug12589_3()
-begin
-  declare spv1 decimal(6,3);
-  set spv1= -123.456;
-
-  create temporary table tm1 as select spv1;
-  show create table tm1;
-  drop temporary table tm1;
-end|
-
-# Note: The type of the field will match the value, not the declared
-#       type of the variable. (This is a type checking issue which
-#       might be changed later.)
-
-# Warning expected from "set spv1 = 'test'", the value is set to decimal "0".
-call bug12589_1()|
-# No warnings here
-call bug12589_2()|
-call bug12589_3()|
-drop procedure bug12589_1|
-drop procedure bug12589_2|
-drop procedure bug12589_3|
-
-#
-# BUG#7049: Stored procedure CALL errors are ignored
-#
---disable_warnings
-drop table if exists t3|
-drop procedure if exists bug7049_1|
-drop procedure if exists bug7049_2|
-drop procedure if exists bug7049_3|
-drop procedure if exists bug7049_4|
-drop function if exists bug7049_1|
-drop function if exists bug7049_2|
---enable_warnings
-
-create table t3 ( x int unique )|
-
-create procedure bug7049_1()
-begin
-  insert into t3 values (42);
-  insert into t3 values (42);
-end|
-
-create procedure bug7049_2()
-begin
-  declare exit handler for sqlexception
-    select 'Caught it' as 'Result';
-
-  call bug7049_1();
-  select 'Missed it' as 'Result';
-end|
-
-create procedure bug7049_3()
-  call bug7049_1()|
-
-create procedure bug7049_4()
-begin
-  declare exit handler for sqlexception
-    select 'Caught it' as 'Result';
-
-  call bug7049_3();
-  select 'Missed it' as 'Result';
-end|
-
-create function bug7049_1()
-  returns int
-begin
-  insert into t3 values (42);
-  insert into t3 values (42);
-  return 42;
-end|
-
-create function bug7049_2()
-  returns int
-begin
-  declare x int default 0;
-  declare continue handler for sqlexception
-    set x = 1;
-
-  set x = bug7049_1();
-  return x;
-end|
-
-call bug7049_2()|
-select * from t3|
-delete from t3|
-call bug7049_4()|
-select * from t3|
-select bug7049_2()|
-
-drop table t3|
-drop procedure bug7049_1|
-drop procedure bug7049_2|
-drop procedure bug7049_3|
-drop procedure bug7049_4|
-drop function bug7049_1|
-drop function bug7049_2|
-
-
-#
-# BUG#13941: replace() string fuction behaves badly inside stored procedure
-# (BUG#13914: IFNULL is returning garbage in stored procedure)
-#
---disable_warnings
-drop function if exists bug13941|
-drop procedure if exists bug13941|
---enable_warnings
-
-create function bug13941(p_input_str text)
-  returns text
-begin
-  declare p_output_str text;
-
-  set p_output_str = p_input_str;
-
-  set p_output_str = replace(p_output_str, 'xyzzy', 'plugh');
-  set p_output_str = replace(p_output_str, 'test', 'prova');
-  set p_output_str = replace(p_output_str, 'this', 'questo');
-  set p_output_str = replace(p_output_str, ' a ', 'una ');
-  set p_output_str = replace(p_output_str, 'is', '');
-
-  return p_output_str;
-end|
-
-create procedure bug13941(out sout varchar(128))
-begin
-  set sout = 'Local';
-  set sout = ifnull(sout, 'DEF');
-end|
-
-# Note: The bug showed different behaviour in different types of builds,
-#  giving garbage results in some, and seemingly working in others.
-#  Running with valgrind (or purify) is the safe way to check that it's
-#  really working correctly.
-select bug13941('this is a test')|
-call bug13941(@a)|
-select @a|
-
-drop function bug13941|
-drop procedure bug13941|
-
-
-#
-# BUG#13095: Cannot create VIEWs in prepared statements
-#
-
-delimiter ;|
-
---disable_warnings
-DROP PROCEDURE IF EXISTS bug13095;
-DROP TABLE IF EXISTS bug13095_t1;
-DROP VIEW IF EXISTS bug13095_v1;
---enable_warnings
-
-delimiter |;
-
-CREATE PROCEDURE bug13095(tbl_name varchar(32))
-BEGIN
-  SET @str =
-    CONCAT("CREATE TABLE ", tbl_name, "(stuff char(15))");
-  SELECT @str;
-  PREPARE stmt FROM @str;
-  EXECUTE stmt;
-
-  SET @str =
-    CONCAT("INSERT INTO ", tbl_name, " VALUES('row1'),('row2'),('row3')" );
-  SELECT @str;
-  PREPARE stmt FROM @str;
-  EXECUTE stmt;
-
-  SET @str =
-    CONCAT("CREATE VIEW bug13095_v1(c1) AS SELECT stuff FROM ", tbl_name);
-  SELECT @str;
-  PREPARE stmt FROM @str;
-  EXECUTE stmt;
-
-  SELECT * FROM bug13095_v1;
-
-  SET @str =
-    "DROP VIEW bug13095_v1";
-  SELECT @str;
-  PREPARE stmt FROM @str;
-  EXECUTE stmt;
-END|
-
-delimiter ;|
-
-CALL bug13095('bug13095_t1');
-
---disable_warnings
-DROP PROCEDURE IF EXISTS bug13095;
-DROP VIEW IF EXISTS bug13095_v1;
-DROP TABLE IF EXISTS bug13095_t1;
---enable_warnings
-
-delimiter |;
-
-#
-# BUG#14210: "Simple query with > operator on large table gives server
-# crash"
-# Check that cursors work in case when HEAP tables are converted to
-# MyISAM
-#
---disable_warnings
-drop procedure if exists bug14210|
---enable_warnings
-set @@session.max_heap_table_size=16384|
-select @@session.max_heap_table_size|
-# To trigger the memory corruption the original table must be InnoDB.
-# No harm if it's not, so don't warn if the suite is run with --skip-innodb
---disable_warnings
-create table t3 (a char(255)) engine=InnoDB|
---enable_warnings
-create procedure bug14210_fill_table()
-begin
-  declare table_size, max_table_size int default 0;
-  select @@session.max_heap_table_size into max_table_size;
-  delete from t3;
-  insert into t3 (a) values (repeat('a', 255));
-  repeat
-    insert into t3 select a from t3;
-    select count(*)*255 from t3 into table_size;
-  until table_size > max_table_size*2 end repeat;
-end|
-call bug14210_fill_table()|
-drop procedure bug14210_fill_table|
-create table t4 like t3|
-
-create procedure bug14210()
-begin
-  declare a char(255);
-  declare done int default 0;
-  declare c cursor for select * from t3;
-  declare continue handler for sqlstate '02000' set done = 1;
-  open c;
-  repeat
-    fetch c into a;
-    if not done then
-       insert into t4 values (upper(a));
-    end if;
-  until done end repeat;
-  close c;
-end|
-call bug14210()|
-select count(*) from t4|
-
-drop table t3, t4|
-drop procedure bug14210|
-set @@session.max_heap_table_size=default|
-
-
-#
-# BUG#1473: Dumping of stored functions seems to cause corruption in
-#           the function body
-#
---disable_warnings
-drop function if exists bug14723|
-drop procedure if exists bug14723|
---enable_warnings
-
-delimiter ;;|
-/*!50003 create function bug14723()
- returns bigint(20)
-main_loop: begin
-  return 42;
-end */;;
-show create function bug14723;;
-select bug14723();;
-
-/*!50003 create procedure bug14723()
-main_loop: begin
-  select 42;
-end */;;
-show create procedure bug14723;;
-call bug14723();;
-
-delimiter |;;
-
-drop function bug14723|
-drop procedure bug14723|
-
-#
-# Bug#14845 "mysql_stmt_fetch returns MYSQL_NO_DATA when COUNT(*) is 0"
-# Check that when fetching from a cursor, COUNT(*) works properly.
-#
-create procedure bug14845()
-begin
-  declare a char(255);
-  declare done int default 0;
-  declare c cursor for select count(*) from t1 where 1 = 0;
-  declare continue handler for sqlstate '02000' set done = 1;
-  open c;
-  repeat
-    fetch c into a;
-    if not done then
-      select a;
-    end if;
-  until done end repeat;
-  close c;
-end|
-call bug14845()|
-drop procedure bug14845|
-
-#
-# BUG#13549 "Server crash with nested stored procedures".
-# Server should not crash when during execution of stored procedure
-# we have to parse trigger/function definition and this new trigger/
-# function has more local variables declared than invoking stored
-# procedure and last of these variables is used in argument of NOT
-# operator.
-#
---disable_warnings
-drop procedure if exists bug13549_1|
-drop procedure if exists bug13549_2|
---enable_warnings
-CREATE PROCEDURE `bug13549_2`()
-begin
-  call bug13549_1();
-end|
-CREATE PROCEDURE `bug13549_1`()
-begin
-  declare done int default 0;
-  set done= not done;
-end|
-CALL bug13549_2()|
-drop procedure bug13549_2|
-drop procedure bug13549_1|
-
-#
-# BUG#10100: function (and stored procedure?) recursivity problem
-#
---disable_warnings
-drop function if exists bug10100f|
-drop procedure if exists bug10100p|
-drop procedure if exists bug10100t|
-drop procedure if exists bug10100pt|
-drop procedure if exists bug10100pv|
-drop procedure if exists bug10100pd|
-drop procedure if exists bug10100pc|
---enable_warnings
-# routines with simple recursion
-create function bug10100f(prm int) returns int
-begin
-  if prm > 1 then
-    return prm * bug10100f(prm - 1);
-  end if;
-  return 1;
-end|
-create procedure bug10100p(prm int, inout res int)
-begin
-  set res = res * prm;
-  if prm > 1 then
-    call bug10100p(prm - 1, res);  
-  end if;
-end|
-create procedure bug10100t(prm int)
-begin
-  declare res int;
-  set res = 1;
-  call bug10100p(prm, res);
-  select res;
-end|
-
-# a procedure which use tables and recursion
-create table t3 (a int)|
-insert into t3 values (0)|
-create view v1 as select a from t3;
-create procedure bug10100pt(level int, lim int)
-begin
-  if level < lim then
-    update t3 set a=level;
-    FLUSH TABLES;
-    call bug10100pt(level+1, lim);
-  else
-    select * from t3;
-  end if;
-end|
-# view & recursion
-create procedure bug10100pv(level int, lim int)
-begin
-  if level < lim then
-    update v1 set a=level;
-    FLUSH TABLES;
-    call bug10100pv(level+1, lim);
-  else
-    select * from v1;
-  end if;
-end|
-# dynamic sql & recursion
-prepare stmt2 from "select * from t3;";
-create procedure bug10100pd(level int, lim int)
-begin
-  if level < lim then
-    select level;
-    prepare stmt1 from "update t3 set a=a+2";
-    execute stmt1;
-    FLUSH TABLES;
-    execute stmt1;
-    FLUSH TABLES;
-    execute stmt1;
-    FLUSH TABLES;
-    deallocate prepare stmt1;
-    execute stmt2;
-    select * from t3;
-    call bug10100pd(level+1, lim);
-  else
-    execute stmt2;
-  end if;
-end|
-# cursor & recursion
-create procedure bug10100pc(level int, lim int)
-begin
-  declare lv int;
-  declare c cursor for select a from t3;
-  open c;
-  if level < lim then
-    select level;
-    fetch c into lv;
-    select lv;
-    update t3 set a=level+lv;
-    FLUSH TABLES;
-    call bug10100pc(level+1, lim);
-  else
-    select * from t3;
-  end if;
-  close c;
-end|
-
-set @@max_sp_recursion_depth=4|
-select @@max_sp_recursion_depth|
--- error ER_SP_NO_RECURSION
-select bug10100f(3)|
--- error ER_SP_NO_RECURSION
-select bug10100f(6)|
-call bug10100t(5)|
-call bug10100pt(1,5)|
-call bug10100pv(1,5)|
-update t3 set a=1|
-call bug10100pd(1,5)|
-select * from t3|
-update t3 set a=1|
-call bug10100pc(1,5)|
-select * from t3|
-set @@max_sp_recursion_depth=0|
-select @@max_sp_recursion_depth|
--- error ER_SP_NO_RECURSION
-select bug10100f(5)|
--- error ER_SP_RECURSION_LIMIT
-call bug10100t(5)|
-
-#end of the stack checking
-set @@max_sp_recursion_depth=255|
-set @var=1|
-#disable log because error about stack overrun contains numbers which
-#depend on a system
--- disable_result_log
--- error ER_STACK_OVERRUN_NEED_MORE
-call bug10100p(255, @var)|
--- error ER_STACK_OVERRUN_NEED_MORE
-call bug10100pt(1,255)|
--- error ER_STACK_OVERRUN_NEED_MORE
-call bug10100pv(1,255)|
--- error ER_STACK_OVERRUN_NEED_MORE
-call bug10100pd(1,255)|
--- error ER_STACK_OVERRUN_NEED_MORE
-call bug10100pc(1,255)|
--- enable_result_log
-set @@max_sp_recursion_depth=0|
-
-deallocate prepare stmt2|
-
-drop function bug10100f|
-drop procedure bug10100p|
-drop procedure bug10100t|
-drop procedure bug10100pt|
-drop procedure bug10100pv|
-drop procedure bug10100pd|
-drop procedure bug10100pc|
-drop view v1|
-
-#
-# BUG#13729: Stored procedures: packet error after exception handled
-#
---disable_warnings
-drop procedure if exists bug13729|
-drop table if exists t3|
---enable_warnings
-
-create table t3 (s1 int, primary key (s1))|
-
-insert into t3 values (1),(2)|
-
-create procedure bug13729()
-begin
-  declare continue handler for sqlexception select 55;
-
-  update t3 set s1 = 1;
-end|
-
-call bug13729()|
-# Used to cause Packets out of order
-select * from t3|
-
-drop procedure bug13729|
-drop table t3|
-
-#
-# BUG#14643: Stored Procedure: Continuing after failed var. initialization
-#            crashes server.
-#
---disable_warnings
-drop procedure if exists bug14643_1|
-drop procedure if exists bug14643_2|
---enable_warnings
-
-create procedure bug14643_1()
-begin
-  declare continue handler for sqlexception select 'boo' as 'Handler';
-
-  begin
-    declare v int default undefined_var;
-
-    if v = 1 then
-      select 1;
-    else
-      select v, isnull(v);
-    end if;
-  end;
-end|
-
-create procedure bug14643_2()
-begin
-  declare continue handler for sqlexception select 'boo' as 'Handler';
-
-  case undefined_var
-  when 1 then
-    select 1;
-  else
-    select 2;
-  end case;
-
-  select undefined_var;
-end|
-
-call bug14643_1()|
-call bug14643_2()|
-
-drop procedure bug14643_1|
-drop procedure bug14643_2|
-
-#
-# BUG#14304: auto_increment field incorrect set in SP
-#
---disable_warnings
-drop procedure if exists bug14304|
-drop table if exists t3, t4|
---enable_warnings
-
-create table t3(a int primary key auto_increment)|
-create table t4(a int primary key auto_increment)|
-
-create procedure bug14304()
-begin
-  insert into t3 set a=null;
-  insert into t4 set a=null;
-  insert into t4 set a=null;
-  insert into t4 set a=null;
-  insert into t4 set a=null;
-  insert into t4 set a=null;
-  insert into t4 select null as a;
-  
-  insert into t3 set a=null;
-  insert into t3 set a=null;
-  
-  select * from t3;
-end|
-
-call bug14304()|
-
-drop procedure bug14304|
-drop table t3, t4|
-
-#
-# BUG#14376: MySQL crash on scoped variable (re)initialization
-#
---disable_warnings
-drop procedure if exists bug14376|
---enable_warnings
-
-create procedure bug14376()
-begin
-  declare x int default x;
-end|
-
-# Not the error we want, but that's what we got for now...
---error ER_BAD_FIELD_ERROR
-call bug14376()|
-drop procedure bug14376|
-
-create procedure bug14376()
-begin
-  declare x int default 42;
-
-  begin
-    declare x int default x;
-
-    select x;
-  end;
-end|
-
-call bug14376()|
-
-drop procedure bug14376|
-
-create procedure bug14376(x int)
-begin
-  declare x int default x;
-
-  select x;
-end|
-
-call bug14376(4711)|
-
-drop procedure bug14376|
-
-#
-# Bug#5967 "Stored procedure declared variable used instead of column"
-# The bug should be fixed later.
-# Test precedence of names of parameters, variable declarations, 
-# variable declarations in nested compound statements, table columns,
-# table columns in cursor declarations.
-# According to the standard, table columns take precedence over
-# variable declarations. In MySQL 5.0 it's vice versa.
-#
-
---disable_warnings
-drop procedure if exists bug5967|
-drop table if exists t3|
---enable_warnings
-create table t3 (a varchar(255))|
-insert into t3 (a) values ("a - table column")|
-create procedure bug5967(a varchar(255))
-begin
-  declare i varchar(255);
-  declare c cursor for select a from t3;
-  select a;
-  select a from t3 into i;
-  select i as 'Parameter takes precedence over table column';                     open c;
-  fetch c into i;
-  close c;
-  select i as 'Parameter takes precedence over table column in cursors';
-  begin
-    declare a varchar(255) default 'a - local variable';
-    declare c1 cursor for select a from t3;
-    select a as 'A local variable takes precedence over parameter';
-    open c1;
-    fetch c1 into i;
-    close c1;
-    select i as 'A local variable takes precedence over parameter in cursors';
-    begin
-      declare a varchar(255) default 'a - local variable in a nested compound statement';
-      declare c2 cursor for select a from t3;
-      select a as 'A local variable in a nested compound statement takes precedence over a local variable in the outer statement';
-      select a from t3 into i;
-      select i as  'A local variable in a nested compound statement takes precedence over table column';
-      open c2;
-      fetch c2 into i;
-      close c2;
-      select i as  'A local variable in a nested compound statement takes precedence over table column in cursors';
-    end;
-  end;
-end|
-call bug5967("a - stored procedure parameter")|
-drop procedure bug5967|
-
-#
-# Bug#13012 "SP: REPAIR/BACKUP/RESTORE TABLE crashes the server"
-#
---disable_warnings
-drop procedure if exists bug13012|
---enable_warnings
-create procedure bug13012()
-BEGIN
-  REPAIR TABLE t1;
-  BACKUP TABLE t1 to '../tmp';
-  DROP TABLE t1;
-  RESTORE TABLE t1 FROM '../tmp';
-END|
-call bug13012()|
-drop procedure bug13012|
-create view v1 as select * from t1|
-create procedure bug13012()
-BEGIN
-  REPAIR TABLE t1,t2,t3,v1;
-  OPTIMIZE TABLE t1,t2,t3,v1;
-  ANALYZE TABLE t1,t2,t3,v1;
-END|
-call bug13012()|
-call bug13012()|
-call bug13012()|
-drop procedure bug13012|
-drop view v1;
-select * from t1|
-
-#
-# A test case for Bug#15392 "Server crashes during prepared statement
-# execute": make sure that stored procedure check for error conditions
-# properly and do not continue execution if an error has been set. 
-#
-# It's necessary to use several DBs because in the original code
-# the successful return of mysql_change_db overrode the error from
-# execution.
-drop schema if exists mysqltest1|
-drop schema if exists mysqltest2|
-drop schema if exists mysqltest3|
-create schema mysqltest1|
-create schema mysqltest2|
-create schema mysqltest3|
-use mysqltest3|
-
-create procedure mysqltest1.p1 (out prequestid varchar(100))
-begin
-  call mysqltest2.p2('call mysqltest3.p3(1, 2)');
-end|
-
-create procedure mysqltest2.p2(in psql text)
-begin
-  declare lsql text;
-  set @lsql= psql;
-  prepare lstatement from @lsql;
-  execute lstatement;
-  deallocate prepare lstatement;
-end|
-
-create procedure mysqltest3.p3(in p1 int)
-begin
-  select p1;
-end|
-
---error ER_SP_WRONG_NO_OF_ARGS
-call mysqltest1.p1(@rs)|
---error ER_SP_WRONG_NO_OF_ARGS
-call mysqltest1.p1(@rs)|
---error ER_SP_WRONG_NO_OF_ARGS
-call mysqltest1.p1(@rs)|
-drop schema if exists mysqltest1|
-drop schema if exists mysqltest2|
-drop schema if exists mysqltest3|
-use test|
-
-#
-# Bug#15441 "Running SP causes Server to Crash": check that an SP variable
-# can not be used in VALUES() function.
-#
---disable_warnings
-drop table if exists t3|
-drop procedure if exists bug15441|
---enable_warnings
-create table t3 (id int not null primary key, county varchar(25))|
-insert into t3 (id, county) values (1, 'York')|
-
-# First check that a stored procedure that refers to a parameter in VALUES()
-# function won't parse.
-
-create procedure bug15441(c varchar(25))
-begin
-  update t3 set id=2, county=values(c);
-end|
---error ER_BAD_FIELD_ERROR
-call bug15441('county')|
-drop procedure bug15441|
-
-# Now check the case when there is an ambiguity between column names
-# and stored procedure parameters: the parser shall resolve the argument
-# of VALUES() function to the column name.
-
-# It's hard to deduce what county refers to in every case (INSERT statement):
-# 1st county refers to the column
-# 2nd county refers to the procedure parameter
-# 3d and 4th county refers to the column, again, but
-# for 4th county it has the value of SP parameter
-
-# In UPDATE statement, just check that values() function returns NULL for
-# non- INSERT...UPDATE statements, as stated in the manual.
-
-create procedure bug15441(county varchar(25))
-begin
-  declare c varchar(25) default "hello";
-
-  insert into t3 (id, county) values (1, county)
-  on duplicate key update county= values(county);
-  select * from t3;
-
-  update t3 set id=2, county=values(id);
-  select * from t3;
-end|
-call bug15441('Yale')|
-drop table t3|
-drop procedure bug15441|
-
-#
-# BUG#14498: Stored procedures: hang if undefined variable and exception
-#
---disable_warnings
-drop procedure if exists bug14498_1|
-drop procedure if exists bug14498_2|
-drop procedure if exists bug14498_3|
-drop procedure if exists bug14498_4|
-drop procedure if exists bug14498_5|
---enable_warnings
-
-create procedure bug14498_1()
-begin
-  declare continue handler for sqlexception select 'error' as 'Handler';
-
-  if v then
-    select 'yes' as 'v';
-  else
-    select 'no' as 'v';
-  end if;
-  select 'done' as 'End';
-end|
-
-create procedure bug14498_2()
-begin
-  declare continue handler for sqlexception select 'error' as 'Handler';
-
-  while v do
-    select 'yes' as 'v';
-  end while;
-  select 'done' as 'End';
-end|
-
-create procedure bug14498_3()
-begin
-  declare continue handler for sqlexception select 'error' as 'Handler';
-
-  repeat
-    select 'maybe' as 'v';
-  until v end repeat;
-  select 'done' as 'End';
-end|
-
-create procedure bug14498_4()
-begin
-  declare continue handler for sqlexception select 'error' as 'Handler';
-
-  case v
-  when 1 then
-    select '1' as 'v';
-  when 2 then
-    select '2' as 'v';
-  else
-    select '?' as 'v';
-  end case;
-  select 'done' as 'End';
-end|
-
-create procedure bug14498_5()
-begin
-  declare continue handler for sqlexception select 'error' as 'Handler';
-
-  case
-  when v = 1 then
-    select '1' as 'v';
-  when v = 2 then
-    select '2' as 'v';
-  else
-    select '?' as 'v';
-  end case;
-  select 'done' as 'End';
-end|
-
-call bug14498_1()|
-call bug14498_2()|
-call bug14498_3()|
-call bug14498_4()|
-call bug14498_5()|
-
-drop procedure bug14498_1|
-drop procedure bug14498_2|
-drop procedure bug14498_3|
-drop procedure bug14498_4|
-drop procedure bug14498_5|
-
-#
-# BUG#15231: Stored procedure bug with not found condition handler
-#
---disable_warnings
-drop table if exists t3|
-drop procedure if exists bug15231_1|
-drop procedure if exists bug15231_2|
-drop procedure if exists bug15231_3|
-drop procedure if exists bug15231_4|
---enable_warnings
-
-create table t3 (id int not null)|
-  
-create procedure bug15231_1()
-begin
-  declare xid integer;
-  declare xdone integer default 0;
-  declare continue handler for not found set xdone = 1;
-
-  set xid=null;
-  call bug15231_2(xid);
-  select xid, xdone;
-end|
-
-create procedure bug15231_2(inout ioid integer)
-begin
-  select "Before NOT FOUND condition is triggered" as '1';
-  select id into ioid from t3 where id=ioid;
-  select "After NOT FOUND condtition is triggered" as '2';
-
-  if ioid is null then
-    set ioid=1;
-  end if;
-end|
-
-create procedure bug15231_3()
-begin
-  declare exit handler for sqlwarning
-    select 'Caught it (wrong)' as 'Result';
-
-  call bug15231_4();
-end|
-
-create procedure bug15231_4()
-begin
-  declare x decimal(2,1);
-
-  set x = 'zap';
-  select 'Missed it (correct)' as 'Result';
-end|
-
-call bug15231_1()|
-call bug15231_3()|
-
-drop table if exists t3|
-drop procedure if exists bug15231_1|
-drop procedure if exists bug15231_2|
-drop procedure if exists bug15231_3|
-drop procedure if exists bug15231_4|
-
-
-#
-# BUG#15011: error handler in nested block not activated
-#
---disable_warnings
-drop procedure if exists bug15011|
---enable_warnings
-
-create table t3 (c1 int primary key)|
-
-insert into t3 values (1)|
-
-create procedure bug15011()
-  deterministic
-begin
-  declare continue handler for 1062
-    select 'Outer' as 'Handler';
-
-  begin
-    declare continue handler for 1062
-      select 'Inner' as 'Handler';
-
-    insert into t3 values (1);
-  end;
-end|
-
-call bug15011()|
-
-drop procedure bug15011|
-drop table t3|
-
-
-#
-# BUG#NNNN: New bug synopsis
-#
-#--disable_warnings
-#drop procedure if exists bugNNNN|
-#--enable_warnings
-#create procedure bugNNNN...
-
-# Add bugs above this line. Use existing tables t1 and t2 when
-# practical, or create table t3, t4 etc temporarily (and drop them).
-delimiter ;|
-drop table t1,t2;

From a29f10e8ee99f96795a6f805a026c61feba77709 Mon Sep 17 00:00:00 2001
From: unknown <georg@lmy002.wdf.sap.corp>
Date: Wed, 2 Aug 2006 10:00:28 +0200
Subject: [PATCH 11/19] Bug #21396: Wrong error number generated for a missing
 table

BitKeeper/etc/collapsed:
  BitKeeper file /home/georg/work/mysql/prod/mysql-5.0/BitKeeper/etc/collapsed
mysys/my_open.c:
  Win64 bit fix: Replacing 32-bit value (0xFFFFFFFF) by a generic error constant.
---
 BitKeeper/etc/collapsed | 1 +
 mysys/my_open.c         | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)
 create mode 100644 BitKeeper/etc/collapsed

diff --git a/BitKeeper/etc/collapsed b/BitKeeper/etc/collapsed
new file mode 100644
index 00000000000..8b90deae622
--- /dev/null
+++ b/BitKeeper/etc/collapsed
@@ -0,0 +1 @@
+44d03f27qNdqJmARzBoP3Is_cN5e0w
diff --git a/mysys/my_open.c b/mysys/my_open.c
index 6ed3cb5becf..a0168b23b16 100644
--- a/mysys/my_open.c
+++ b/mysys/my_open.c
@@ -335,7 +335,7 @@ File my_sopen(const char *path, int oflag, int shflag, int pmode)
    * try to open/create the file
    */
   if ((osfh= CreateFile(path, fileaccess, fileshare, &SecurityAttributes, 
-                        filecreate, fileattrib, NULL)) == (HANDLE)0xffffffff)
+                        filecreate, fileattrib, NULL)) == INVALID_HANDLE_VALUE)
   {
     /*
      * OS call to open/create file failed! map the error, release
@@ -346,7 +346,7 @@ File my_sopen(const char *path, int oflag, int shflag, int pmode)
     return -1;                      /* return error to caller */
   }
 
-  fh= _open_osfhandle((long)osfh, oflag & (_O_APPEND | _O_RDONLY | _O_TEXT));
+  fh= _open_osfhandle((intptr_t)osfh, oflag & (_O_APPEND | _O_RDONLY | _O_TEXT));
 
   return fh;                        /* return handle */
 }

From cb6e70a55c985824981ebc2987b6f71c9219ec59 Mon Sep 17 00:00:00 2001
From: unknown <kostja@bodhi.local>
Date: Wed, 2 Aug 2006 13:25:13 +0400
Subject: [PATCH 12/19] Fix a compilation failiure on QNX

sql/udf_example.c:
  Declare tmp_error at the beginning of the block (this is C now)
---
 sql/udf_example.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sql/udf_example.c b/sql/udf_example.c
index 62995085599..a80fce81278 100644
--- a/sql/udf_example.c
+++ b/sql/udf_example.c
@@ -806,6 +806,7 @@ char *reverse_lookup(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args,
 #if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
   char name_buff[256];
   struct hostent tmp_hostent;
+  int tmp_errno;
 #endif
   struct hostent *hp;
   unsigned long taddr;
@@ -845,7 +846,6 @@ char *reverse_lookup(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args,
     return 0;
   }
 #if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
-  int tmp_errno;
   if (!(hp=gethostbyaddr_r((char*) &taddr,sizeof(taddr), AF_INET,
 			   &tmp_hostent, name_buff,sizeof(name_buff),
 			   &tmp_errno)))

From ef976d20c95cb547dcb6123f0072d06bea61f177 Mon Sep 17 00:00:00 2001
From: unknown <ingo/istruewing@chilla.local>
Date: Wed, 2 Aug 2006 17:57:06 +0200
Subject: [PATCH 13/19] Bug#18775 - Temporary table from alter table visible to
 other threads Continued implementation of WL#1324 (table name to filename
 encoding)

The intermediate (not temporary) files of the new table
during ALTER TABLE was visible for SHOW TABLES. These
intermediate files are copies of the original table with
the changes done by ALTER TABLE. After all the data is
copied over from the original table, these files are renamed
to the original tables file names. So they are not temporary
files. They persist after ALTER TABLE, but just with another
name.

In 5.0 the intermediate files are invisible for SHOW TABLES
because all file names beginning with "#sql" were suppressed.

This failed since 5.1.6 because even temporary table names were
converted when making file names from them. The prefix became
converted to "@0023sql". Converting the prefix during SHOW TABLES
would suppress the listing of user tables that start with "#sql".

The solution of the problem is to continue the implementation of
the table name to file name conversion feature. One requirement
is to suppress the conversion for temporary table names.

This change is straightforward for real temporary tables as there
is a function that creates temporary file names.

But the generated path names are located in TMPDIR and have no
relation to the internal table name. This cannot be used for
ALTER TABLE. Its intermediate files need to be in the same
directory as the old table files. And it is necessary to be
able to deduce the same path from the same table name repeatedly.

Consequently the intermediate table files must be handled like normal
tables. Their internal names shall start with tmp_file_prefix
(#sql) and they shall not be converted like normal table names.

I added a flags parameter to all relevant functions that are
called from ALTER TABLE. It is used to suppress the conversion
for the intermediate table files.

The outcome is that the suppression of #sql in SHOW TABLES
works again. It does not suppress user tables as these are
converted to @0023sql on file level.

This patch does also fix ALTER TABLE ... RENAME, which could not
rename a table with non-ASCII characters in its name.

It does also fix the problem that a user could create a table like
`#sql-xxxx-yyyy`, where xxxx is mysqld's pid and yyyy is the thread
ID of some other thread, which prevented this thread from running
ALTER TABLE.

Some of the above problems are mentioned in Bug 1405, which can
be closed with this patch.

This patch does also contain some minor fixes for other forgotten
conversions. Still known problems are reported as bugs 21370,
21373, and 21387.


mysql-test/r/alter_table.result:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added test results.
mysql-test/r/backup.result:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added test results.
mysql-test/r/repair.result:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added test results.
mysql-test/t/alter_table.test:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added test cases.
mysql-test/t/backup.test:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added test cases.
mysql-test/t/repair.test:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added a test case.
sql/ha_myisam.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added missing table name mapping calls to backup() and restore().
sql/ha_myisammrg.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/ha_ndbcluster.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/ha_ndbcluster_binlog.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/ha_ndbcluster_binlog.h:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Removed unnecessary check for wrong temp file prefix.
sql/mysql_priv.h:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Extended quick_rm_table(), mysql_rename_table(), and
  build_table_filename() by an flags argument, which can indicate
  temporary table names that should not be converted.
  Added symbolic flag values.
sql/sql_acl.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_base.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Fixed a comment.
  Added DBUG calls.
sql/sql_db.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_delete.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_insert.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_partition.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_rename.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_show.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Reverted the former fix for this bug. tmp_file_prefix is now used
  verbatim in the comparison of file names.
sql/sql_table.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added a check for a tmp_file_prefix file name to
  filename_to_tablename(). These names are now accepted without
  conversion.
  Extended quick_rm_table(), mysql_rename_table(), and
  build_table_filename() by an flags argument, which can indicate
  temporary table names that should not be converted.
  Removed the table to file name conversion from
  build_tmptable_filename().
  Disabled REPAIR TABLE ... USE_FRM for temporary tables.
  Added the forgotten conversion to mysql_alter_table() for the case
  of ALTER TABLE ... RENAME.
  Added comments and DBUG calls.
sql/sql_trigger.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/sql_view.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Added an zero argument for the new 'flags' parameter.
sql/table.cc:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Replaced a literal ".frm" by reg_ext.
  Added DBUG calls.
storage/innobase/row/row0mysql.c:
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Changed back the encoded temp file prefix to #sql.
---
 mysql-test/r/alter_table.result  |  60 +++++++
 mysql-test/r/backup.result       |  20 +++
 mysql-test/r/repair.result       |   6 +
 mysql-test/t/alter_table.test    |  63 +++++++
 mysql-test/t/backup.test         |  19 ++
 mysql-test/t/repair.test         |  13 ++
 sql/ha_myisam.cc                 |  10 +-
 sql/ha_myisammrg.cc              |   2 +-
 sql/ha_ndbcluster.cc             |  14 +-
 sql/ha_ndbcluster_binlog.cc      |  13 +-
 sql/ha_ndbcluster_binlog.h       |   2 +-
 sql/mysql_priv.h                 |  17 +-
 sql/sql_acl.cc                   |   2 +-
 sql/sql_base.cc                  |  13 +-
 sql/sql_db.cc                    |  22 +--
 sql/sql_delete.cc                |   2 +-
 sql/sql_insert.cc                |   8 +-
 sql/sql_partition.cc             |  26 +--
 sql/sql_rename.cc                |   8 +-
 sql/sql_show.cc                  |  11 +-
 sql/sql_table.cc                 | 292 +++++++++++++++++++++++--------
 sql/sql_trigger.cc               |  17 +-
 sql/sql_view.cc                  |   6 +-
 sql/table.cc                     |  13 +-
 storage/innobase/row/row0mysql.c |   4 +-
 25 files changed, 503 insertions(+), 160 deletions(-)

diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result
index f4332ea9888..3095d5337ed 100644
--- a/mysql-test/r/alter_table.result
+++ b/mysql-test/r/alter_table.result
@@ -657,3 +657,63 @@ SELECT * FROM t1;
 v	b
 abc	5
 DROP TABLE t1;
+DROP DATABASE IF EXISTS mysqltest;
+CREATE DATABASE mysqltest;
+use mysqltest;
+DROP TABLE IF EXISTS `t1_n�gel`, `t1_bl�ten`;
+CREATE TABLE `t1_n�gel` (c1 INT);
+ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
+CREATE TABLE `t1_n�gel` (c1 INT);
+ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
+ERROR 42S01: Table 't1_blЭten' already exists
+DROP TABLE   `t1_n�gel`, `t1_bl�ten`;
+CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
+ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
+CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
+ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
+ERROR 42S01: Table 'tt1_blЭten' already exists
+SHOW CREATE TABLE `tt1_bl�ten`;
+Table	Create Table
+tt1_bl�ten	CREATE TEMPORARY TABLE `tt1_bl�ten` (
+  `c1` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE   `tt1_n�gel`, `tt1_bl�ten`;
+CREATE TABLE `#sql1` (c1 INT);
+CREATE TABLE `@0023sql2` (c1 INT);
+SHOW TABLES;
+Tables_in_mysqltest
+#sql1
+@0023sql2
+RENAME TABLE `#sql1`     TO `@0023sql1`;
+RENAME TABLE `@0023sql2` TO `#sql2`;
+SHOW TABLES;
+Tables_in_mysqltest
+#sql2
+@0023sql1
+ALTER TABLE `@0023sql1`  RENAME `#sql-1`;
+ALTER TABLE `#sql2`      RENAME `@0023sql-2`;
+SHOW TABLES;
+Tables_in_mysqltest
+#sql-1
+@0023sql-2
+INSERT INTO `#sql-1`     VALUES (1);
+INSERT INTO `@0023sql-2` VALUES (2);
+DROP TABLE `#sql-1`, `@0023sql-2`;
+CREATE TEMPORARY TABLE `#sql1` (c1 INT);
+CREATE TEMPORARY TABLE `@0023sql2` (c1 INT);
+SHOW TABLES;
+Tables_in_mysqltest
+ALTER TABLE `#sql1`      RENAME `@0023sql1`;
+ALTER TABLE `@0023sql2`  RENAME `#sql2`;
+SHOW TABLES;
+Tables_in_mysqltest
+INSERT INTO `#sql2`      VALUES (1);
+INSERT INTO `@0023sql1`  VALUES (2);
+SHOW CREATE TABLE `@0023sql1`;
+Table	Create Table
+@0023sql1	CREATE TEMPORARY TABLE `@0023sql1` (
+  `c1` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE `#sql2`, `@0023sql1`;
+use test;
+DROP DATABASE mysqltest;
diff --git a/mysql-test/r/backup.result b/mysql-test/r/backup.result
index a65808bbdd6..05761240ca7 100644
--- a/mysql-test/r/backup.result
+++ b/mysql-test/r/backup.result
@@ -101,3 +101,23 @@ test.t5	backup	status	OK
 Warnings:
 Warning	1541	The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
 drop table t5;
+DROP TABLE IF EXISTS `t-bl�ten`;
+CREATE  TABLE `t-bl�ten` (c1 INT);
+INSERT  INTO  `t-bl�ten` VALUES (1), (2), (3);
+BACKUP  TABLE `t-bl�ten` TO '../tmp';
+Table	Op	Msg_type	Msg_text
+test.t-bl�ten	backup	status	OK
+Warnings:
+Warning	1541	The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
+DROP    TABLE `t-bl�ten`;
+RESTORE TABLE `t-bl�ten` FROM '../tmp';
+Table	Op	Msg_type	Msg_text
+test.t-bl�ten	restore	status	OK
+Warnings:
+Warning	1541	The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
+SELECT * FROM `t-bl�ten`;
+c1
+1
+2
+3
+DROP    TABLE `t-bl�ten`;
diff --git a/mysql-test/r/repair.result b/mysql-test/r/repair.result
index d8fa4dbbb72..f08dc6a8a4a 100644
--- a/mysql-test/r/repair.result
+++ b/mysql-test/r/repair.result
@@ -41,3 +41,9 @@ Table	Op	Msg_type	Msg_text
 test.t1	repair	warning	Number of rows changed from 0 to 1
 test.t1	repair	status	OK
 drop table t1;
+DROP TABLE IF EXISTS tt1;
+CREATE TEMPORARY TABLE tt1 (c1 INT);
+REPAIR TABLE tt1 USE_FRM;
+Table	Op	Msg_type	Msg_text
+tt1	repair	error	Cannot repair temporary table from .frm file
+DROP TABLE tt1;
diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test
index efe58579785..f6af92e0044 100644
--- a/mysql-test/t/alter_table.test
+++ b/mysql-test/t/alter_table.test
@@ -482,3 +482,66 @@ SELECT * FROM t1;
 ALTER TABLE t1 MODIFY COLUMN v VARCHAR(4);
 SELECT * FROM t1;
 DROP TABLE t1;
+
+# End of 5.0 tests
+
+#
+# Bug#18775 - Temporary table from alter table visible to other threads
+#
+# Use a special database to avoid name clashes with user tables.
+--disable_warnings
+DROP DATABASE IF EXISTS mysqltest;
+--enable_warnings
+CREATE DATABASE mysqltest;
+use mysqltest;
+#
+# Check if non-ASCII alphabetic characters work and duplicates are detected.
+--disable_warnings
+DROP TABLE IF EXISTS `t1_n�gel`, `t1_bl�ten`;
+--enable_warnings
+CREATE TABLE `t1_n�gel` (c1 INT);
+ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
+CREATE TABLE `t1_n�gel` (c1 INT);
+--error ER_TABLE_EXISTS_ERROR
+ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
+DROP TABLE   `t1_n�gel`, `t1_bl�ten`;
+#
+# Same for temporary tables though these names do not become file names.
+CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
+ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
+CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
+--error ER_TABLE_EXISTS_ERROR
+ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
+SHOW CREATE TABLE `tt1_bl�ten`;
+DROP TABLE   `tt1_n�gel`, `tt1_bl�ten`;
+#
+# Check if special characters as in tmp_file_prefix work.
+CREATE TABLE `#sql1` (c1 INT);
+CREATE TABLE `@0023sql2` (c1 INT);
+SHOW TABLES;
+RENAME TABLE `#sql1`     TO `@0023sql1`;
+RENAME TABLE `@0023sql2` TO `#sql2`;
+SHOW TABLES;
+ALTER TABLE `@0023sql1`  RENAME `#sql-1`;
+ALTER TABLE `#sql2`      RENAME `@0023sql-2`;
+SHOW TABLES;
+INSERT INTO `#sql-1`     VALUES (1);
+INSERT INTO `@0023sql-2` VALUES (2);
+DROP TABLE `#sql-1`, `@0023sql-2`;
+#
+# Same for temporary tables though these names do not become file names.
+CREATE TEMPORARY TABLE `#sql1` (c1 INT);
+CREATE TEMPORARY TABLE `@0023sql2` (c1 INT);
+SHOW TABLES;
+ALTER TABLE `#sql1`      RENAME `@0023sql1`;
+ALTER TABLE `@0023sql2`  RENAME `#sql2`;
+SHOW TABLES;
+INSERT INTO `#sql2`      VALUES (1);
+INSERT INTO `@0023sql1`  VALUES (2);
+SHOW CREATE TABLE `@0023sql1`;
+DROP TABLE `#sql2`, `@0023sql1`;
+#
+# Cleanup
+use test;
+DROP DATABASE mysqltest;
+
diff --git a/mysql-test/t/backup.test b/mysql-test/t/backup.test
index 917c3f98ebb..fa6bbc21813 100644
--- a/mysql-test/t/backup.test
+++ b/mysql-test/t/backup.test
@@ -58,3 +58,22 @@ drop table t5;
 --system rm $MYSQLTEST_VARDIR/tmp/t?.*
 
 # End of 4.1 tests
+# End of 5.0 tests
+
+#
+# Bug#18775 - Temporary table from alter table visible to other threads
+#
+# Backup did not encode table names.
+--disable_warnings
+DROP TABLE IF EXISTS `t-bl�ten`;
+--enable_warnings
+CREATE  TABLE `t-bl�ten` (c1 INT);
+INSERT  INTO  `t-bl�ten` VALUES (1), (2), (3);
+BACKUP  TABLE `t-bl�ten` TO '../tmp';
+DROP    TABLE `t-bl�ten`;
+#
+# Same for restore.
+RESTORE TABLE `t-bl�ten` FROM '../tmp';
+SELECT * FROM `t-bl�ten`;
+DROP    TABLE `t-bl�ten`;
+
diff --git a/mysql-test/t/repair.test b/mysql-test/t/repair.test
index 16e1d76d460..c79768dbb46 100644
--- a/mysql-test/t/repair.test
+++ b/mysql-test/t/repair.test
@@ -35,3 +35,16 @@ repair table t1 use_frm;
 drop table t1;
 
 # End of 4.1 tests
+# End of 5.0 tests
+
+#
+# Bug#18775 - Temporary table from alter table visible to other threads
+#
+# REPAIR TABLE ... USE_FRM on temporary table crashed the table or server.
+--disable_warnings
+DROP TABLE IF EXISTS tt1;
+--enable_warnings
+CREATE TEMPORARY TABLE tt1 (c1 INT);
+REPAIR TABLE tt1 USE_FRM;
+DROP TABLE tt1;
+
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index 2d097c34f97..55b39f46c19 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -464,11 +464,14 @@ int ha_myisam::restore(THD* thd, HA_CHECK_OPT *check_opt)
   HA_CHECK_OPT tmp_check_opt;
   char *backup_dir= thd->lex->backup_dir;
   char src_path[FN_REFLEN], dst_path[FN_REFLEN];
-  const char *table_name= table->s->table_name.str;
+  char table_name[FN_REFLEN];
   int error;
   const char* errmsg;
   DBUG_ENTER("restore");
 
+  VOID(tablename_to_filename(table->s->table_name.str, table_name,
+                             sizeof(table_name)));
+
   if (fn_format_relative_to_data_home(src_path, table_name, backup_dir,
 				      MI_NAME_DEXT))
     DBUG_RETURN(HA_ADMIN_INVALID);
@@ -504,11 +507,14 @@ int ha_myisam::backup(THD* thd, HA_CHECK_OPT *check_opt)
 {
   char *backup_dir= thd->lex->backup_dir;
   char src_path[FN_REFLEN], dst_path[FN_REFLEN];
-  const char *table_name= table->s->table_name.str;
+  char table_name[FN_REFLEN];
   int error;
   const char *errmsg;
   DBUG_ENTER("ha_myisam::backup");
 
+  VOID(tablename_to_filename(table->s->table_name.str, table_name,
+                             sizeof(table_name)));
+
   if (fn_format_relative_to_data_home(dst_path, table_name, backup_dir,
 				      reg_ext))
   {
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index afeed5f79df..5afabffcefe 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -473,7 +473,7 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
         an embedded server without changing the paths in the .MRG file.
       */
       uint length= build_table_filename(buff, sizeof(buff),
-                                        tables->db, tables->table_name, "");
+                                        tables->db, tables->table_name, "", 0);
       /*
         If a MyISAM table is in the same directory as the MERGE table,
         we use the table name without a path. This means that the
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 8b17dae9d7e..47c877ccf4d 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -5795,7 +5795,7 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
     DBUG_RETURN(HA_ERR_NO_CONNECTION);  
   ndb->setDatabaseName(db);
   NDBDICT* dict= ndb->getDictionary();
-  build_table_filename(key, sizeof(key), db, name, "");
+  build_table_filename(key, sizeof(key), db, name, "", 0);
   NDB_SHARE *share= get_share(key, 0, false);
   if (share && get_ndb_share_state(share) == NSS_ALTERED)
   {
@@ -5938,7 +5938,7 @@ int ndbcluster_drop_database_impl(const char *path)
   // Drop any tables belonging to database
   char full_path[FN_REFLEN];
   char *tmp= full_path +
-    build_table_filename(full_path, sizeof(full_path), dbname, "", "");
+    build_table_filename(full_path, sizeof(full_path), dbname, "", "", 0);
 
   ndb->setDatabaseName(dbname);
   List_iterator_fast<char> it(drop_list);
@@ -6061,7 +6061,7 @@ int ndbcluster_find_all_files(THD *thd)
     
       /* check if database exists */
       char *end= key +
-        build_table_filename(key, sizeof(key), elmt.database, "", "");
+        build_table_filename(key, sizeof(key), elmt.database, "", "", 0);
       if (my_access(key, F_OK))
       {
         /* no such database defined, skip table */
@@ -6204,7 +6204,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
     }
     
     // File is not in NDB, check for .ndb file with this name
-    build_table_filename(name, sizeof(name), db, file_name, ha_ndb_ext);
+    build_table_filename(name, sizeof(name), db, file_name, ha_ndb_ext, 0);
     DBUG_PRINT("info", ("Check access for %s", name));
     if (my_access(name, F_OK))
     {
@@ -6229,7 +6229,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
   /* setup logging to binlog for all discovered tables */
   {
     char *end, *end1= name +
-      build_table_filename(name, sizeof(name), db, "", "");
+      build_table_filename(name, sizeof(name), db, "", "", 0);
     for (i= 0; i < ok_tables.records; i++)
     {
       file_name= (char*)hash_element(&ok_tables, i);
@@ -6251,7 +6251,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
     file_name= hash_element(&ndb_tables, i);
     if (!hash_search(&ok_tables, file_name, strlen(file_name)))
     {
-      build_table_filename(name, sizeof(name), db, file_name, reg_ext);
+      build_table_filename(name, sizeof(name), db, file_name, reg_ext, 0);
       if (my_access(name, F_OK))
       {
         DBUG_PRINT("info", ("%s must be discovered", file_name));
@@ -6802,7 +6802,7 @@ uint ndb_get_commitcount(THD *thd, char *dbname, char *tabname,
   NDB_SHARE *share;
   DBUG_ENTER("ndb_get_commitcount");
 
-  build_table_filename(name, sizeof(name), dbname, tabname, "");
+  build_table_filename(name, sizeof(name), dbname, tabname, "", 0);
   DBUG_PRINT("enter", ("name: %s", name));
   pthread_mutex_lock(&ndbcluster_mutex);
   if (!(share=(NDB_SHARE*) hash_search(&ndbcluster_open_tables,
diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc
index 8e9f0077dd0..ee9e639199c 100644
--- a/sql/ha_ndbcluster_binlog.cc
+++ b/sql/ha_ndbcluster_binlog.cc
@@ -737,7 +737,7 @@ static int ndbcluster_create_apply_status_table(THD *thd)
   */
   {
     build_table_filename(buf, sizeof(buf),
-                         NDB_REP_DB, NDB_APPLY_TABLE, reg_ext);
+                         NDB_REP_DB, NDB_APPLY_TABLE, reg_ext, 0);
     my_delete(buf, MYF(0));
   }
 
@@ -786,7 +786,7 @@ static int ndbcluster_create_schema_table(THD *thd)
   */
   {
     build_table_filename(buf, sizeof(buf),
-                         NDB_REP_DB, NDB_SCHEMA_TABLE, reg_ext);
+                         NDB_REP_DB, NDB_SCHEMA_TABLE, reg_ext, 0);
     my_delete(buf, MYF(0));
   }
 
@@ -1247,7 +1247,7 @@ int ndbcluster_log_schema_op(THD *thd, NDB_SHARE *share,
   NDB_SCHEMA_OBJECT *ndb_schema_object;
   {
     char key[FN_REFLEN];
-    build_table_filename(key, sizeof(key), db, table_name, "");
+    build_table_filename(key, sizeof(key), db, table_name, "", 0);
     ndb_schema_object= ndb_get_schema_object(key, TRUE, FALSE);
   }
 
@@ -1577,7 +1577,7 @@ ndb_handle_schema_change(THD *thd, Ndb *ndb, NdbEventOperation *pOp,
     
     DBUG_PRINT("info", ("Detected frm change of table %s.%s",
                         dbname, tabname));
-    build_table_filename(key, FN_LEN-1, dbname, tabname, NullS);
+    build_table_filename(key, FN_LEN-1, dbname, tabname, NullS, 0);
     /*
       If the frm of the altered table is different than the one on
       disk then overwrite it with the new table definition
@@ -1775,7 +1775,8 @@ ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *ndb,
 	case SOT_TRUNCATE_TABLE:
         {
           char key[FN_REFLEN];
-          build_table_filename(key, sizeof(key), schema->db, schema->name, "");
+          build_table_filename(key, sizeof(key),
+                               schema->db, schema->name, "", 0);
           NDB_SHARE *share= get_share(key, 0, FALSE, FALSE);
           // invalidation already handled by binlog thread
           if (!share || !share->op)
@@ -1979,7 +1980,7 @@ ndb_binlog_thread_handle_schema_event_post_epoch(THD *thd,
     {
       enum SCHEMA_OP_TYPE schema_type= (enum SCHEMA_OP_TYPE)schema->type;
       char key[FN_REFLEN];
-      build_table_filename(key, sizeof(key), schema->db, schema->name, "");
+      build_table_filename(key, sizeof(key), schema->db, schema->name, "", 0);
       if (schema_type == SOT_CLEAR_SLOCK)
       {
         pthread_mutex_lock(&ndbcluster_mutex);
diff --git a/sql/ha_ndbcluster_binlog.h b/sql/ha_ndbcluster_binlog.h
index 58bf7517df5..4c3cd105d1d 100644
--- a/sql/ha_ndbcluster_binlog.h
+++ b/sql/ha_ndbcluster_binlog.h
@@ -23,7 +23,7 @@ typedef NdbDictionary::Index  NDBINDEX;
 typedef NdbDictionary::Dictionary  NDBDICT;
 typedef NdbDictionary::Event  NDBEVENT;
 
-#define IS_TMP_PREFIX(A) (is_prefix(A, tmp_file_prefix) || is_prefix(A, "@0023sql"))
+#define IS_TMP_PREFIX(A) (is_prefix(A, tmp_file_prefix))
 
 extern ulong ndb_extra_logging;
 
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 7cff7d7531c..c12ec1a9204 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -733,7 +733,7 @@ int mysql_rm_table_part2_with_lock(THD *thd, TABLE_LIST *tables,
 				   bool if_exists, bool drop_temporary,
 				   bool log_query);
 bool quick_rm_table(handlerton *base,const char *db,
-                    const char *table_name);
+                    const char *table_name, uint flags);
 void close_cached_table(THD *thd, TABLE *table);
 bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent);
 bool mysql_change_db(THD *thd,const char *name,bool no_access_check);
@@ -880,11 +880,9 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool do_send_ok);
 bool mysql_create_like_table(THD *thd, TABLE_LIST *table,
                              HA_CREATE_INFO *create_info,
                              Table_ident *src_table);
-bool mysql_rename_table(handlerton *base,
-			const char *old_db,
-			const char * old_name,
-			const char *new_db,
-			const char * new_name);
+bool mysql_rename_table(handlerton *base, const char *old_db,
+                        const char * old_name, const char *new_db,
+                        const char * new_name, uint flags);
 bool mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys);
 bool mysql_drop_index(THD *thd, TABLE_LIST *table_list,
                       ALTER_INFO *alter_info);
@@ -1827,7 +1825,12 @@ uint strconvert(CHARSET_INFO *from_cs, const char *from,
 uint filename_to_tablename(const char *from, char *to, uint to_length);
 uint tablename_to_filename(const char *from, char *to, uint to_length);
 uint build_table_filename(char *buff, size_t bufflen, const char *db,
-                          const char *table, const char *ext);
+                          const char *table, const char *ext, uint flags);
+/* Flags for conversion functions. */
+#define FN_FROM_IS_TMP  (1 << 0)
+#define FN_TO_IS_TMP    (1 << 1)
+#define FN_IS_TMP       (FN_FROM_IS_TMP | FN_TO_IS_TMP)
+
 /* from hostname.cc */
 struct in_addr;
 my_string ip_to_hostname(struct in_addr *in,uint *errors);
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index deb7fe2d2b8..1c0ec6b4347 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2962,7 +2962,7 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list,
       {
         char buf[FN_REFLEN];
         build_table_filename(buf, sizeof(buf), table_list->db,
-                             table_list->table_name, reg_ext);
+                             table_list->table_name, reg_ext, 0);
         fn_format(buf, buf, "", "", MY_UNPACK_FILENAME  | MY_RESOLVE_SYMLINKS |
                                     MY_RETURN_REAL_PATH | MY_APPEND_EXT);
         if (access(buf,F_OK))
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index c2ebd140720..f54a8c6ac4a 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -252,7 +252,7 @@ uint cached_table_definitions(void)
   Get TABLE_SHARE for a table.
 
   get_table_share()
-  thd			Table share
+  thd			Thread handle
   table_list		Table that should be opened
   key			Table cache key
   key_length		Length of key
@@ -1499,15 +1499,18 @@ TABLE *find_temporary_table(THD *thd, TABLE_LIST *table_list)
   char	key[MAX_DBKEY_LENGTH];
   uint	key_length;
   TABLE *table;
+  DBUG_ENTER("find_temporary_table");
+  DBUG_PRINT("enter", ("table: '%s'.'%s'",
+                       table_list->db, table_list->table_name));
 
   key_length= create_table_def_key(thd, key, table_list, 1);
   for (table=thd->temporary_tables ; table ; table= table->next)
   {
     if (table->s->table_cache_key.length == key_length &&
 	!memcmp(table->s->table_cache_key.str, key, key_length))
-      return table;
+      DBUG_RETURN(table);
   }
-  return 0;					// Not a temporary table
+  DBUG_RETURN(0);					// Not a temporary table
 }
 
 
@@ -1948,7 +1951,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
       char path[FN_REFLEN];
       enum legacy_db_type not_used;
       build_table_filename(path, sizeof(path) - 1,
-                           table_list->db, table_list->table_name, reg_ext);
+                           table_list->db, table_list->table_name, reg_ext, 0);
       if (mysql_frm_type(thd, path, &not_used) == FRMTYPE_VIEW)
       {
         /*
@@ -3487,6 +3490,8 @@ TABLE *open_temporary_table(THD *thd, const char *path, const char *db,
   uint key_length;
   TABLE_LIST table_list;
   DBUG_ENTER("open_temporary_table");
+  DBUG_PRINT("enter", ("table: '%s'.'%s'  path: '%s'",
+                       db, table_name, path));
 
   table_list.db=         (char*) db;
   table_list.table_name= (char*) table_name;
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 41e7e5df1f7..67d09da3d60 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -560,7 +560,7 @@ bool mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info,
   VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
 
   /* Check directory */
-  path_len= build_table_filename(path, sizeof(path), db, "", "");
+  path_len= build_table_filename(path, sizeof(path), db, "", "", 0);
   path[path_len-1]= 0;                    // Remove last '/' from path
 
   if (my_stat(path,&stat_info,MYF(0)))
@@ -704,7 +704,7 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
      We pass MY_DB_OPT_FILE as "extension" to avoid
      "table name to file name" encoding.
   */
-  build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE);
+  build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE, 0);
   if ((error=write_db_opt(thd, path, create_info)))
     goto exit;
 
@@ -797,7 +797,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
 
   VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
 
-  length= build_table_filename(path, sizeof(path), db, "", "");
+  length= build_table_filename(path, sizeof(path), db, "", "", 0);
   strmov(path+length, MY_DB_OPT_FILE);		// Append db option file name
   del_dbopt(path);				// Remove dboption hash entry
   path[length]= '\0';				// Remove file name
@@ -1327,7 +1327,7 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
     }
   }
 #endif
-  length= build_table_filename(path, sizeof(path), dbname, "", "");
+  length= build_table_filename(path, sizeof(path), dbname, "", "", 0);
   if (length && path[length-1] == FN_LIBCHAR)
     path[length-1]=0;				// remove ending '\'
   if (my_access(path,F_OK))
@@ -1480,11 +1480,12 @@ bool mysql_rename_db(THD *thd, LEX_STRING *old_db, LEX_STRING *new_db)
   if (thd->db && !strcmp(thd->db, old_db->str))
     change_to_newdb= 1;
 
-  build_table_filename(path, sizeof(path)-1, old_db->str, "", MY_DB_OPT_FILE);
+  build_table_filename(path, sizeof(path)-1,
+                       old_db->str, "", MY_DB_OPT_FILE, 0);
   if ((load_db_opt(thd, path, &create_info)))
     create_info.default_table_charset= thd->variables.collation_server;
 
-  length= build_table_filename(path, sizeof(path)-1, old_db->str, "", "");
+  length= build_table_filename(path, sizeof(path)-1, old_db->str, "", "", 0);
   if (length && path[length-1] == FN_LIBCHAR)
     path[length-1]=0;                            // remove ending '\'
   if ((error= my_access(path,F_OK)))
@@ -1549,9 +1550,10 @@ bool mysql_rename_db(THD *thd, LEX_STRING *old_db, LEX_STRING *new_db)
       If some tables were left in the new directory, rmdir() will fail.
       It garantees we never loose any tables.
     */
-    build_table_filename(path, sizeof(path)-1, new_db->str,"",MY_DB_OPT_FILE);
+    build_table_filename(path, sizeof(path)-1,
+                         new_db->str,"",MY_DB_OPT_FILE, 0);
     my_delete(path, MYF(MY_WME));
-    length= build_table_filename(path, sizeof(path)-1, new_db->str, "", "");
+    length= build_table_filename(path, sizeof(path)-1, new_db->str, "", "", 0);
     if (length && path[length-1] == FN_LIBCHAR)
       path[length-1]=0;                            // remove ending '\'
     rmdir(path);
@@ -1603,9 +1605,9 @@ bool mysql_rename_db(THD *thd, LEX_STRING *old_db, LEX_STRING *new_db)
 
       /* pass empty file name, and file->name as extension to avoid encoding */
       build_table_filename(oldname, sizeof(oldname)-1,
-                           old_db->str, "", file->name);
+                           old_db->str, "", file->name, 0);
       build_table_filename(newname, sizeof(newname)-1,
-                           new_db->str, "", file->name);
+                           new_db->str, "", file->name, 0);
       my_rename(oldname, newname, MYF(MY_WME));
     }
     my_dirend(dirp);  
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index b9ce1a53aaf..25fb6d99d08 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -888,7 +888,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
   }
 
   path_length= build_table_filename(path, sizeof(path), table_list->db,
-                                    table_list->table_name, reg_ext);
+                                    table_list->table_name, reg_ext, 0);
 
   if (!dont_send_ok)
   {
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 1f93bc99483..1a9acd79f6e 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2721,7 +2721,8 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
                                 ((thd->prelocked_mode == PRELOCKED) ?
                                  MYSQL_OPEN_IGNORE_LOCKED_TABLES:0)))))
         quick_rm_table(create_info->db_type, create_table->db,
-                       table_case_name(create_info, create_table->table_name));
+                       table_case_name(create_info, create_table->table_name),
+                       0);
     }
     reenable_binlog(thd);
     if (!table)                                   // open failed
@@ -2743,7 +2744,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
     hash_delete(&open_cache,(byte*) table);
     VOID(pthread_mutex_unlock(&LOCK_open));
     quick_rm_table(create_info->db_type, create_table->db,
-		   table_case_name(create_info, create_table->table_name));
+		   table_case_name(create_info, create_table->table_name), 0);
     DBUG_RETURN(0);
   }
   table->file->extra(HA_EXTRA_WRITE_CACHE);
@@ -2931,7 +2932,8 @@ void select_create::abort()
       table->s->version= 0;
       hash_delete(&open_cache,(byte*) table);
       if (!create_info->table_existed)
-        quick_rm_table(table_type, create_table->db, create_table->table_name);
+        quick_rm_table(table_type, create_table->db,
+                       create_table->table_name, 0);
       /* Tell threads waiting for refresh that something has happened */
       if (version != refresh_version)
         broadcast_refresh();
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 44c0b8ffcd9..8dcceae72ca 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -3430,7 +3430,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
       char *src_db= table_ident->db.str ? table_ident->db.str : thd->db;
       char *src_table= table_ident->table.str;
       char buf[FN_REFLEN];
-      build_table_filename(buf, sizeof(buf), src_db, src_table, "");
+      build_table_filename(buf, sizeof(buf), src_db, src_table, "", 0);
       if (partition_default_handling(table, part_info,
                                      FALSE, buf))
       {
@@ -4704,7 +4704,7 @@ static bool mysql_change_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
   handler *file= lpt->table->file;
   DBUG_ENTER("mysql_change_partitions");
 
-  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "");
+  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
   if ((error= file->change_partitions(lpt->create_info, path, &lpt->copied,
                                       &lpt->deleted, lpt->pack_frm_data,
                                       lpt->pack_frm_len)))
@@ -4744,7 +4744,7 @@ static bool mysql_rename_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
   int error;
   DBUG_ENTER("mysql_rename_partitions");
 
-  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "");
+  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
   if ((error= lpt->table->file->rename_partitions(path)))
   {
     if (error != 1)
@@ -4785,7 +4785,7 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
   int error;
   DBUG_ENTER("mysql_drop_partitions");
 
-  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "");
+  build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
   if ((error= lpt->table->file->drop_partitions(path)))
   {
     lpt->table->file->print_error(error, MYF(0));
@@ -5136,7 +5136,7 @@ static bool write_log_drop_shadow_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
   DBUG_ENTER("write_log_drop_shadow_frm");
 
   build_table_filename(shadow_path, sizeof(shadow_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   pthread_mutex_lock(&LOCK_gdl);
   if (write_log_replace_delete_frm(lpt, 0UL, NULL,
                                   (const char*)shadow_path, FALSE))
@@ -5184,9 +5184,9 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
 
   part_info->first_log_entry= NULL;
   build_table_filename(path, sizeof(path), lpt->db,
-                       lpt->table_name, "");
+                       lpt->table_name, "", 0);
   build_table_filename(shadow_path, sizeof(shadow_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   pthread_mutex_lock(&LOCK_gdl);
   if (write_log_replace_delete_frm(lpt, 0UL, shadow_path, path, TRUE))
     goto error;
@@ -5238,9 +5238,9 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
 
   part_info->first_log_entry= NULL;
   build_table_filename(path, sizeof(path), lpt->db,
-                       lpt->table_name, "");
+                       lpt->table_name, "", 0);
   build_table_filename(tmp_path, sizeof(tmp_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   pthread_mutex_lock(&LOCK_gdl);
   if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
                                    FALSE))
@@ -5295,9 +5295,9 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
   DBUG_ENTER("write_log_add_change_partition");
 
   build_table_filename(path, sizeof(path), lpt->db,
-                       lpt->table_name, "");
+                       lpt->table_name, "", 0);
   build_table_filename(tmp_path, sizeof(tmp_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   pthread_mutex_lock(&LOCK_gdl);
   if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
                                    FALSE))
@@ -5352,9 +5352,9 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
 
   part_info->first_log_entry= NULL;
   build_table_filename(path, sizeof(path), lpt->db,
-                       lpt->table_name, "");
+                       lpt->table_name, "", 0);
   build_table_filename(shadow_path, sizeof(shadow_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   pthread_mutex_lock(&LOCK_gdl);
   if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
                       lpt->alter_info->flags & ALTER_REORGANIZE_PARTITION))
diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc
index e3468b2b5cf..73473ddd24b 100644
--- a/sql/sql_rename.cc
+++ b/sql/sql_rename.cc
@@ -157,14 +157,14 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error)
       new_alias= new_table->table_name;
     }
     build_table_filename(name, sizeof(name),
-                         new_table->db, new_alias, reg_ext);
+                         new_table->db, new_alias, reg_ext, 0);
     if (!access(name,F_OK))
     {
       my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
       DBUG_RETURN(ren_table);			// This can't be skipped
     }
     build_table_filename(name, sizeof(name),
-                         ren_table->db, old_alias, reg_ext);
+                         ren_table->db, old_alias, reg_ext, 0);
 
     frm_type= mysql_frm_type(thd, name, &table_type);
     switch (frm_type)
@@ -178,7 +178,7 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error)
           if (!(rc= mysql_rename_table(ha_resolve_by_legacy_type(thd,
                                                                  table_type),
                                        ren_table->db, old_alias,
-                                       new_table->db, new_alias)))
+                                       new_table->db, new_alias, 0)))
           {
             if ((rc= Table_triggers_list::change_table_name(thd, ren_table->db,
                                                             old_alias,
@@ -194,7 +194,7 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error)
               (void) mysql_rename_table(ha_resolve_by_legacy_type(thd,
                                                                   table_type),
                                         new_table->db, new_alias,
-                                        ren_table->db, old_alias);
+                                        ren_table->db, old_alias, 0);
             }
           }
         }
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 8f8c84c2db5..4b8e7f8f538 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -463,7 +463,6 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
   uint col_access=thd->col_access;
 #endif
   TABLE_LIST table_list;
-  char tbbuff[FN_REFLEN];
   DBUG_ENTER("mysql_find_files");
 
   if (wild && !wild[0])
@@ -480,8 +479,6 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
     DBUG_RETURN(-1);
   }
 
-  VOID(tablename_to_filename(tmp_file_prefix, tbbuff, sizeof(tbbuff)));
-
   for (i=0 ; i < (uint) dirp->number_off_files  ; i++)
   {
     char uname[NAME_LEN*3+1];                   /* Unencoded name */
@@ -519,7 +516,7 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
     {
         // Return only .frm files which aren't temp files.
       if (my_strcasecmp(system_charset_info, ext=fn_rext(file->name),reg_ext) ||
-          is_prefix(file->name,tbbuff))
+          is_prefix(file->name, tmp_file_prefix))
         continue;
       *ext=0;
       VOID(filename_to_tablename(file->name, uname, sizeof(uname)));
@@ -688,7 +685,7 @@ bool mysqld_show_create_db(THD *thd, char *dbname,
   }
   else
   {
-    length= build_table_filename(path, sizeof(path), dbname, "", "");
+    length= build_table_filename(path, sizeof(path), dbname, "", "", 0);
     found_libchar= 0;
     if (length && path[length-1] == FN_LIBCHAR)
     {
@@ -2530,7 +2527,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
       }
       else
       {
-        len= build_table_filename(path, sizeof(path), base_name, "", "");
+        len= build_table_filename(path, sizeof(path), base_name, "", "", 0);
         end= path + len;
         len= FN_LEN - len;
         if (mysql_find_files(thd, &files, base_name, 
@@ -2684,7 +2681,7 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
 	(grant_option && !check_grant_db(thd, file_name)))
 #endif
     {
-      length= build_table_filename(path, sizeof(path), file_name, "", "");
+      length= build_table_filename(path, sizeof(path), file_name, "", "", 0);
       found_libchar= 0;
       if (length && path[length-1] == FN_LIBCHAR)
       {
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index d9a43e4580f..a5aa490fdac 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -53,31 +53,77 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
 #define MYSQL50_TABLE_NAME_PREFIX         "#mysql50#"
 #define MYSQL50_TABLE_NAME_PREFIX_LENGTH  9
 
+
+/*
+  Translate a file name to a table name (WL #1324).
+
+  SYNOPSIS
+    filename_to_tablename()
+      from                      The file name in my_charset_filename.
+      to                OUT     The table name in system_charset_info.
+      to_length                 The size of the table name buffer.
+
+  RETURN
+    Table name length.
+*/
+
 uint filename_to_tablename(const char *from, char *to, uint to_length)
 {
-  uint errors, res= strconvert(&my_charset_filename, from,
-                               system_charset_info,  to, to_length, &errors);
-  if (errors) // Old 5.0 name
+  uint errors;
+  uint res;
+  DBUG_ENTER("filename_to_tablename");
+  DBUG_PRINT("enter", ("from '%s'", from));
+
+  if (!memcmp(from, tmp_file_prefix, tmp_file_prefix_length))
   {
-    res= strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX,  from, NullS) - to;
-    sql_print_error("Invalid (old?) table or database name '%s'", from);
-    /*
-      TODO: add a stored procedure for fix table and database names,
-      and mention its name in error log.
-    */
+    /* Temporary table name. */
+    res= (strnmov(to, from, to_length) - to);
   }
-  return res;
+  else
+  {
+    res= strconvert(&my_charset_filename, from,
+                    system_charset_info,  to, to_length, &errors);
+    if (errors) // Old 5.0 name
+    {
+      res= (strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX,  from, NullS) -
+            to);
+      sql_print_error("Invalid (old?) table or database name '%s'", from);
+      /*
+        TODO: add a stored procedure for fix table and database names,
+        and mention its name in error log.
+      */
+    }
+  }
+
+  DBUG_PRINT("exit", ("to '%s'", to));
+  DBUG_RETURN(res);
 }
 
 
+/*
+  Translate a table name to a file name (WL #1324).
+
+  SYNOPSIS
+    tablename_to_filename()
+      from                      The table name in system_charset_info.
+      to                OUT     The file name in my_charset_filename.
+      to_length                 The size of the file name buffer.
+
+  RETURN
+    File name length.
+*/
+
 uint tablename_to_filename(const char *from, char *to, uint to_length)
 {
   uint errors, length;
+  DBUG_ENTER("tablename_to_filename");
+  DBUG_PRINT("enter", ("from '%s'", from));
+
   if (from[0] == '#' && !strncmp(from, MYSQL50_TABLE_NAME_PREFIX,
                                  MYSQL50_TABLE_NAME_PREFIX_LENGTH))
-    return (uint) (strmake(to, from+MYSQL50_TABLE_NAME_PREFIX_LENGTH,
-                           to_length-1) -
-                   (from + MYSQL50_TABLE_NAME_PREFIX_LENGTH));
+    DBUG_RETURN((uint) (strmake(to, from+MYSQL50_TABLE_NAME_PREFIX_LENGTH,
+                                to_length-1) -
+                        (from + MYSQL50_TABLE_NAME_PREFIX_LENGTH)));
   length= strconvert(system_charset_info, from,
                      &my_charset_filename, to, to_length, &errors);
   if (check_if_legal_tablename(to) &&
@@ -86,7 +132,8 @@ uint tablename_to_filename(const char *from, char *to, uint to_length)
     memcpy(to + length, "@@@", 4);
     length+= 3;
   }
-  return length;
+  DBUG_PRINT("exit", ("to '%s'", to));
+  DBUG_RETURN(length);
 }
 
 
@@ -95,52 +142,87 @@ uint tablename_to_filename(const char *from, char *to, uint to_length)
 
   SYNOPSIS
    build_table_filename()
-   buff			where to write result
-   bufflen              buff size
-   db                   database name, in system_charset_info
-   table                table name, in system_charset_info
-   ext                  file extension
+     buff                       Where to write result in my_charset_filename.
+     bufflen                    buff size
+     db                         Database name in system_charset_info.
+     table_name                 Table name in system_charset_info.
+     ext                        File extension.
+     flags                      FN_FROM_IS_TMP or FN_TO_IS_TMP or FN_IS_TMP
+                                table_name is temporary, do not change.
 
   NOTES
 
     Uses database and table name, and extension to create
     a file name in mysql_data_dir. Database and table
     names are converted from system_charset_info into "fscs".
+    Unless flags indicate a temporary table name.
+    'db' is always converted.
     'ext' is not converted.
 
-  RETURN
+    The conversion suppression is required for ALTER TABLE. This
+    statement creates intermediate tables. These are regular
+    (non-temporary) tables with a temporary name. Their path names must
+    be derivable from the table name. So we cannot use
+    build_tmptable_filename() for them.
 
+  RETURN
+    path length
 */
 
-
 uint build_table_filename(char *buff, size_t bufflen, const char *db,
-                          const char *table, const char *ext)
+                          const char *table_name, const char *ext, uint flags)
 {
   uint length;
   char dbbuff[FN_REFLEN];
   char tbbuff[FN_REFLEN];
-  VOID(tablename_to_filename(table, tbbuff, sizeof(tbbuff)));
+  DBUG_ENTER("build_table_filename");
+
+  if (flags & FN_IS_TMP) // FN_FROM_IS_TMP | FN_TO_IS_TMP
+    strnmov(tbbuff, table_name, sizeof(tbbuff));
+  else
+    VOID(tablename_to_filename(table_name, tbbuff, sizeof(tbbuff)));
+
   VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
-  strxnmov(buff, bufflen,
-           mysql_data_home, "/", dbbuff, "/", tbbuff, ext, NullS);
-  length= unpack_filename(buff, buff);
-  return length;
+  length= strxnmov(buff, bufflen, mysql_data_home, "/", dbbuff,
+                   "/", tbbuff, ext, NullS) - buff;
+  DBUG_PRINT("exit", ("buff: '%s'", buff));
+  DBUG_RETURN(length);
 }
 
 
+/*
+  Creates path to a file: mysql_tmpdir/#sql1234_12_1.ext
+
+  SYNOPSIS
+   build_tmptable_filename()
+     thd                        The thread handle.
+     buff                       Where to write result in my_charset_filename.
+     bufflen                    buff size
+
+  NOTES
+
+    Uses current_pid, thread_id, and tmp_table counter to create
+    a file name in mysql_tmpdir.
+
+  RETURN
+    path length
+*/
+
 uint build_tmptable_filename(THD* thd, char *buff, size_t bufflen)
 {
   uint length;
-  char tbbuff[FN_REFLEN];
   char tmp_table_name[tmp_file_prefix_length+22+22+22+3];
+  DBUG_ENTER("build_tmptable_filename");
+
   my_snprintf(tmp_table_name, sizeof(tmp_table_name),
 	      "%s%lx_%lx_%x",
 	      tmp_file_prefix, current_pid,
 	      thd->thread_id, thd->tmp_table++);
-  VOID(tablename_to_filename(tmp_table_name, tbbuff, sizeof(tbbuff)));
-  strxnmov(buff, bufflen, mysql_tmpdir, "/", tbbuff, reg_ext, NullS);
+
+  strxnmov(buff, bufflen, mysql_tmpdir, "/", tmp_table_name, reg_ext, NullS);
   length= unpack_filename(buff, buff);
-  return length;
+  DBUG_PRINT("exit", ("buff: '%s'", buff));
+  DBUG_RETURN(length);
 }
 
 /*
@@ -1203,7 +1285,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
     Build shadow frm file name
   */
   build_table_filename(shadow_path, sizeof(shadow_path), lpt->db,
-                       lpt->table_name, "#");
+                       lpt->table_name, "#", 0);
   strxmov(shadow_frm_name, shadow_path, reg_ext, NullS);
   if (flags & WFRM_WRITE_SHADOW)
   {
@@ -1287,7 +1369,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
       Build frm file name
     */
     build_table_filename(path, sizeof(path), lpt->db,
-                         lpt->table_name, "");
+                         lpt->table_name, "", 0);
     strxmov(frm_name, path, reg_ext, NullS);
     /*
       When we are changing to use new frm file we need to ensure that we
@@ -1608,7 +1690,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
       alias= (lower_case_table_names == 2) ? table->alias : table->table_name;
       /* remove .frm file and engine files */
       path_length= build_table_filename(path, sizeof(path),
-                                        db, alias, reg_ext);
+                                        db, alias, reg_ext, 0);
     }
     if (drop_temporary ||
         (table_type == NULL &&        
@@ -1732,15 +1814,30 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
 }
 
 
+/*
+  Quickly remove a table.
+
+  SYNOPSIS
+    quick_rm_table()
+      base                      The handlerton handle.
+      db                        The database name.
+      table_name                The table name.
+      flags                     flags for build_table_filename().
+
+  RETURN
+    0           OK
+    != 0        Error
+*/
+
 bool quick_rm_table(handlerton *base,const char *db,
-		   const char *table_name)
+                    const char *table_name, uint flags)
 {
   char path[FN_REFLEN];
   bool error= 0;
   DBUG_ENTER("quick_rm_table");
 
   uint path_length= build_table_filename(path, sizeof(path),
-                                         db, table_name, reg_ext);
+                                         db, table_name, reg_ext, flags);
   if (my_delete(path,MYF(0)))
     error= 1; /* purecov: inspected */
   path[path_length - reg_ext_length]= '\0'; // Remove reg_ext
@@ -2891,7 +2988,7 @@ static void set_table_default_charset(THD *thd,
     HA_CREATE_INFO db_info;
     char path[FN_REFLEN];
     /* Abuse build_table_filename() to build the path to the db.opt file */
-    build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE);
+    build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE, 0);
     load_db_opt(thd, path, &db_info);
     create_info->default_table_charset= db_info.default_table_charset;
   }
@@ -3074,6 +3171,8 @@ bool mysql_create_table_internal(THD *thd,
   handler	*file;
   bool		error= TRUE;
   DBUG_ENTER("mysql_create_table_internal");
+  DBUG_PRINT("enter", ("db: '%s'  table: '%s'  tmp: %d",
+                       db, table_name, internal_tmp_table));
 
   if (use_copy_create_info)
   {
@@ -3293,7 +3392,8 @@ bool mysql_create_table_internal(THD *thd,
       start++;
     }	  
 #endif
-    path_length= build_table_filename(path, sizeof(path), db, alias, reg_ext);
+    path_length= build_table_filename(path, sizeof(path), db, alias, reg_ext,
+                                      internal_tmp_table ? FN_IS_TMP : 0);
   }
 
   /* Check if table already exists */
@@ -3337,9 +3437,13 @@ bool mysql_create_table_internal(THD *thd,
   */
   if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
   {
+    char dbbuff[FN_REFLEN];
+    char tbbuff[FN_REFLEN];
     bool create_if_not_exists =
       create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS;
-    if (ha_table_exists_in_engine(thd, db, table_name))
+    VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
+    VOID(tablename_to_filename(table_name, tbbuff, sizeof(tbbuff)));
+    if (ha_table_exists_in_engine(thd, dbbuff, tbbuff))
     {
       DBUG_PRINT("info", ("Table with same name already existed in handler"));
 
@@ -3491,12 +3595,30 @@ make_unique_key_name(const char *field_name,KEY *start,KEY *end)
 ** Alter a table definition
 ****************************************************************************/
 
+
+/*
+  Rename a table.
+
+  SYNOPSIS
+    mysql_rename_table()
+      base                      The handlerton handle.
+      old_db                    The old database name.
+      old_name                  The old table name.
+      new_db                    The new database name.
+      new_name                  The new table name.
+      flags                     flags for build_table_filename().
+                                FN_FROM_IS_TMP old_name is temporary.
+                                FN_TO_IS_TMP   new_name is temporary.
+
+  RETURN
+    0           OK
+    != 0        Error
+*/
+
 bool
-mysql_rename_table(handlerton *base,
-		   const char *old_db,
-		   const char *old_name,
-		   const char *new_db,
-		   const char *new_name)
+mysql_rename_table(handlerton *base, const char *old_db,
+                   const char *old_name, const char *new_db,
+                   const char *new_name, uint flags)
 {
   THD *thd= current_thd;
   char from[FN_REFLEN], to[FN_REFLEN], lc_from[FN_REFLEN], lc_to[FN_REFLEN];
@@ -3505,12 +3627,16 @@ mysql_rename_table(handlerton *base,
   handler *file;
   int error=0;
   DBUG_ENTER("mysql_rename_table");
+  DBUG_PRINT("enter", ("old: '%s'.'%s'  new: '%s'.'%s'",
+                       old_db, old_name, new_db, new_name));
 
   file= (base == NULL ? 0 :
          get_new_handler((TABLE_SHARE*) 0, thd->mem_root, base));
 
-  build_table_filename(from, sizeof(from), old_db, old_name, "");
-  build_table_filename(to, sizeof(to), new_db, new_name, "");
+  build_table_filename(from, sizeof(from), old_db, old_name, "",
+                       flags & FN_FROM_IS_TMP);
+  build_table_filename(to, sizeof(to), new_db, new_name, "",
+                       flags & FN_TO_IS_TMP);
 
   /*
     If lower_case_table_names == 2 (case-preserving but case-insensitive
@@ -3522,12 +3648,14 @@ mysql_rename_table(handlerton *base,
   {
     strmov(tmp_name, old_name);
     my_casedn_str(files_charset_info, tmp_name);
-    build_table_filename(lc_from, sizeof(lc_from), old_db, tmp_name, "");
+    build_table_filename(lc_from, sizeof(lc_from), old_db, tmp_name, "",
+                         flags & FN_FROM_IS_TMP);
     from_base= lc_from;
 
     strmov(tmp_name, new_name);
     my_casedn_str(files_charset_info, tmp_name);
-    build_table_filename(lc_to, sizeof(lc_to), new_db, tmp_name, "");
+    build_table_filename(lc_to, sizeof(lc_to), new_db, tmp_name, "",
+                         flags & FN_TO_IS_TMP);
     to_base= lc_to;
   }
 
@@ -3663,7 +3791,8 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table,
     if (fn_format_relative_to_data_home(src_path, uname, backup_dir, reg_ext))
       DBUG_RETURN(-1); // protect buffer overflow
 
-    build_table_filename(dst_path, sizeof(dst_path), db, table_name, reg_ext);
+    build_table_filename(dst_path, sizeof(dst_path),
+                         db, table_name, reg_ext, 0);
 
     if (lock_and_wait_for_table_name(thd,table))
       DBUG_RETURN(-1);
@@ -3740,6 +3869,15 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list,
     table= &tmp_table;
     pthread_mutex_unlock(&LOCK_open);
   }
+  /*
+    REPAIR TABLE ... USE_FRM for temporary tables makes little sense.
+  */
+  if (table->s->tmp_table)
+  {
+    error= send_check_errmsg(thd, table_list, "repair",
+			     "Cannot repair temporary table from .frm file");
+    goto end;
+  }
 
   /*
     User gave us USE_FRM which means that the header in the index file is
@@ -4437,7 +4575,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
   else
   {
     build_table_filename(src_path, sizeof(src_path),
-                         src_db, src_table, reg_ext);
+                         src_db, src_table, reg_ext, 0);
     /* Resolve symlinks (for windows) */
     unpack_filename(src_path, src_path);
     if (lower_case_table_names)
@@ -4476,7 +4614,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
   else
   {
     dst_path_length= build_table_filename(dst_path, sizeof(dst_path),
-                                          db, table_name, reg_ext);
+                                          db, table_name, reg_ext, 0);
     if (!access(dst_path, F_OK))
       goto table_exists;
   }
@@ -4526,7 +4664,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
   else if (err)
   {
     (void) quick_rm_table(create_info->db_type, db,
-			  table_name); /* purecov: inspected */
+			  table_name, 0); /* purecov: inspected */
     goto err;	    /* purecov: inspected */
   }
 
@@ -5005,8 +5143,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
   db=table_list->db;
   if (!new_db || !my_strcasecmp(table_alias_charset, new_db, db))
     new_db= db;
-  build_table_filename(reg_path, sizeof(reg_path), db, table_name, reg_ext);
-  build_table_filename(path, sizeof(path), db, table_name, "");
+  build_table_filename(reg_path, sizeof(reg_path), db, table_name, reg_ext, 0);
+  build_table_filename(path, sizeof(path), db, table_name, "", 0);
 
   used_fields=create_info->used_fields;
 
@@ -5023,6 +5161,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
   /* Check that we are not trying to rename to an existing table */
   if (new_name)
   {
+    DBUG_PRINT("info", ("new_db.new_name: '%s'.'%s'", new_db, new_name));
     strmov(new_name_buff,new_name);
     strmov(new_alias= new_alias_buff, new_name);
     if (lower_case_table_names)
@@ -5055,11 +5194,9 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
       }
       else
       {
-	char dir_buff[FN_REFLEN];
-	strxnmov(dir_buff, sizeof(dir_buff)-1,
-                 mysql_real_data_home, new_db, NullS);
-	if (!access(fn_format(new_name_buff,new_name_buff,dir_buff,reg_ext,0),
-		    F_OK))
+        build_table_filename(new_name_buff, sizeof(new_name_buff),
+                             new_db, new_name_buff, reg_ext, 0);
+        if (!access(new_name_buff, F_OK))
 	{
 	  /* Table will be closed in do_command() */
 	  my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
@@ -5142,13 +5279,13 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
 	*fn_ext(new_name)=0;
         table->s->version= 0;                   // Force removal of table def
 	close_cached_table(thd, table);
-	if (mysql_rename_table(old_db_type,db,table_name,new_db,new_alias))
+	if (mysql_rename_table(old_db_type,db,table_name,new_db,new_alias, 0))
 	  error= -1;
         else if (Table_triggers_list::change_table_name(thd, db, table_name,
                                                         new_db, new_alias))
         {
           VOID(mysql_rename_table(old_db_type, new_db, new_alias, db,
-                                  table_name));
+                                  table_name, 0));
           error= -1;
         }
       }
@@ -5776,7 +5913,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
     {
       char path[FN_REFLEN];
       /* table is a normal table: Create temporary table in same directory */
-      build_table_filename(path, sizeof(path), new_db, tmp_name, "");
+      build_table_filename(path, sizeof(path), new_db, tmp_name, "",
+                           FN_IS_TMP);
       new_table=open_temporary_table(thd, path, new_db, tmp_name,0);
     }
     if (!new_table)
@@ -5992,7 +6130,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
   VOID(pthread_mutex_lock(&LOCK_open));
   if (error)
   {
-    VOID(quick_rm_table(new_db_type,new_db,tmp_name));
+    VOID(quick_rm_table(new_db_type, new_db, tmp_name, FN_IS_TMP));
     VOID(pthread_mutex_unlock(&LOCK_open));
     goto err;
   }
@@ -6014,7 +6152,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
     {
       error=1;
       my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_name_buff);
-      VOID(quick_rm_table(new_db_type,new_db,tmp_name));
+      VOID(quick_rm_table(new_db_type, new_db, tmp_name, FN_IS_TMP));
       VOID(pthread_mutex_unlock(&LOCK_open));
       goto err;
     }
@@ -6042,22 +6180,24 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
   error=0;
   if (!need_copy_table)
     new_db_type=old_db_type= NULL; // this type cannot happen in regular ALTER
-  if (mysql_rename_table(old_db_type,db,table_name,db,old_name))
+  if (mysql_rename_table(old_db_type, db, table_name, db, old_name,
+                         FN_TO_IS_TMP))
   {
     error=1;
-    VOID(quick_rm_table(new_db_type,new_db,tmp_name));
+    VOID(quick_rm_table(new_db_type, new_db, tmp_name, FN_IS_TMP));
   }
   else if (mysql_rename_table(new_db_type,new_db,tmp_name,new_db,
-			      new_alias) ||
+			      new_alias, FN_FROM_IS_TMP) ||
            (new_name != table_name || new_db != db) && // we also do rename
            Table_triggers_list::change_table_name(thd, db, table_name,
                                                   new_db, new_alias))
-       
-  {						// Try to get everything back
+  {
+    /* Try to get everything back. */
     error=1;
-    VOID(quick_rm_table(new_db_type,new_db,new_alias));
-    VOID(quick_rm_table(new_db_type,new_db,tmp_name));
-    VOID(mysql_rename_table(old_db_type,db,old_name,db,alias));
+    VOID(quick_rm_table(new_db_type,new_db,new_alias, 0));
+    VOID(quick_rm_table(new_db_type, new_db, tmp_name, FN_IS_TMP));
+    VOID(mysql_rename_table(old_db_type, db, old_name, db, alias,
+                            FN_FROM_IS_TMP));
   }
   if (error)
   {
@@ -6101,7 +6241,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
       table->s->version= 0;              	// Force removal of table def
       close_cached_table(thd,table);
     }
-    VOID(quick_rm_table(old_db_type,db,old_name));
+    VOID(quick_rm_table(old_db_type, db, old_name, FN_IS_TMP));
   }
   else
   {
@@ -6118,7 +6258,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
       /* end threads waiting on lock */
       mysql_lock_abort(thd,table, TRUE);
     }
-    VOID(quick_rm_table(old_db_type,db,old_name));
+    VOID(quick_rm_table(old_db_type, db, old_name, FN_IS_TMP));
     if (close_data_tables(thd,db,table_name) ||
 	reopen_tables(thd,1,0))
     {						// This shouldn't happen
@@ -6168,7 +6308,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
       shutdown.
     */
     char path[FN_REFLEN];
-    build_table_filename(path, sizeof(path), new_db, table_name, "");
+    build_table_filename(path, sizeof(path), new_db, table_name, "", 0);
     table=open_temporary_table(thd, path, new_db, tmp_name,0);
     if (table)
     {
@@ -6199,7 +6339,7 @@ end_temporary:
     close_temporary_table(thd, new_table, 1, 1);
   }
   else
-    VOID(quick_rm_table(new_db_type,new_db,tmp_name));
+    VOID(quick_rm_table(new_db_type, new_db, tmp_name, FN_IS_TMP));
 
  err:
   DBUG_RETURN(TRUE);
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc
index 5abdfa27d58..52bcb88ad8e 100644
--- a/sql/sql_trigger.cc
+++ b/sql/sql_trigger.cc
@@ -457,12 +457,12 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
   */
   file.length= build_table_filename(file_buff, FN_REFLEN-1,
                                     tables->db, tables->table_name,
-                                    triggers_file_ext);
+                                    triggers_file_ext, 0);
   file.str= file_buff;
   trigname_file.length= build_table_filename(trigname_buff, FN_REFLEN-1,
                                              tables->db,
                                              lex->spname->m_name.str,
-                                             trigname_file_ext);
+                                             trigname_file_ext, 0);
   trigname_file.str= trigname_buff;
 
   /* Use the filesystem to enforce trigger namespace constraints. */
@@ -568,7 +568,7 @@ err_with_cleanup:
 static bool rm_trigger_file(char *path, const char *db,
                             const char *table_name)
 {
-  build_table_filename(path, FN_REFLEN-1, db, table_name, triggers_file_ext);
+  build_table_filename(path, FN_REFLEN-1, db, table_name, triggers_file_ext, 0);
   return my_delete(path, MYF(MY_WME));
 }
 
@@ -591,7 +591,8 @@ static bool rm_trigger_file(char *path, const char *db,
 static bool rm_trigname_file(char *path, const char *db,
                              const char *trigger_name)
 {
-  build_table_filename(path, FN_REFLEN-1, db, trigger_name, trigname_file_ext);
+  build_table_filename(path, FN_REFLEN-1,
+                       db, trigger_name, trigname_file_ext, 0);
   return my_delete(path, MYF(MY_WME));
 }
 
@@ -617,7 +618,7 @@ static bool save_trigger_file(Table_triggers_list *triggers, const char *db,
   LEX_STRING file;
 
   file.length= build_table_filename(file_buff, FN_REFLEN-1, db, table_name,
-                                    triggers_file_ext);
+                                    triggers_file_ext, 0);
   file.str= file_buff;
   return sql_create_definition_file(NULL, &file, &triggers_file_type,
                                     (gptr)triggers, triggers_file_parameters,
@@ -792,7 +793,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
   DBUG_ENTER("Table_triggers_list::check_n_load");
 
   path.length= build_table_filename(path_buff, FN_REFLEN-1,
-                                    db, table_name, triggers_file_ext);
+                                    db, table_name, triggers_file_ext, 0);
   path.str= path_buff;
 
   // QQ: should we analyze errno somehow ?
@@ -1141,7 +1142,7 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig)
 
   path.length= build_table_filename(path_buff, FN_REFLEN-1,
                                     trig->m_db.str, trig->m_name.str,
-                                    trigname_file_ext);
+                                    trigname_file_ext, 0);
   path.str= path_buff;
 
   if (access(path_buff, F_OK))
@@ -1348,7 +1349,7 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name,
   {
     trigname_file.length= build_table_filename(trigname_buff, FN_REFLEN-1,
                                                db_name, trigger->str,
-                                               trigname_file_ext);
+                                               trigname_file_ext, 0);
     trigname_file.str= trigname_buff;
 
     trigname.trigger_table= *new_table_name;
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 94ece79da81..f77953bc99e 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -606,11 +606,11 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
 
   /* print file name */
   dir.length= build_table_filename(dir_buff, sizeof(dir_buff),
-                                   view->db, "", "");
+                                   view->db, "", "", 0);
   dir.str= dir_buff;
 
   path.length= build_table_filename(path_buff, sizeof(path_buff),
-                                    view->db, view->table_name, reg_ext);
+                                    view->db, view->table_name, reg_ext, 0);
   path.str= path_buff;
 
   file.str= path.str + dir.length;
@@ -1237,7 +1237,7 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
     TABLE_SHARE *share;
     bool type= 0;
     build_table_filename(path, sizeof(path),
-                         view->db, view->table_name, reg_ext);
+                         view->db, view->table_name, reg_ext, 0);
     VOID(pthread_mutex_lock(&LOCK_open));
     if (access(path, F_OK) ||
 	(type= (mysql_frm_type(thd, path, &not_used) != FRMTYPE_VIEW)))
diff --git a/sql/table.cc b/sql/table.cc
index 8bee8bf1598..ec790f7ba7d 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -68,7 +68,7 @@ static byte *get_field_name(Field **buff, uint *length,
 char *fn_rext(char *name)
 {
   char *res= strrchr(name, '.');
-  if (res && !strcmp(res, ".frm"))
+  if (res && !strcmp(res, reg_ext))
     return res;
   return name + strlen(name);
 }
@@ -95,10 +95,13 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key,
   TABLE_SHARE *share;
   char path[FN_REFLEN];
   uint path_length;
+  DBUG_ENTER("alloc_table_share");
+  DBUG_PRINT("enter", ("table: '%s'.'%s'",
+                       table_list->db, table_list->table_name));
 
   path_length= build_table_filename(path, sizeof(path) - 1,
                                     table_list->db,
-                                    table_list->table_name, "");
+                                    table_list->table_name, "", 0);
   init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
   if ((share= (TABLE_SHARE*) alloc_root(&mem_root,
 					sizeof(*share) + key_length +
@@ -148,7 +151,7 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key,
     pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST);
     pthread_cond_init(&share->cond, NULL);
   }
-  return share;
+  DBUG_RETURN(share);
 }
 
 
@@ -179,6 +182,7 @@ void init_tmp_table_share(TABLE_SHARE *share, const char *key,
                           const char *path)
 {
   DBUG_ENTER("init_tmp_table_share");
+  DBUG_PRINT("enter", ("table: '%s'.'%s'", key, table_name));
 
   bzero((char*) share, sizeof(*share));
   init_sql_alloc(&share->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
@@ -286,7 +290,8 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags)
   char	path[FN_REFLEN];
   MEM_ROOT **root_ptr, *old_root;
   DBUG_ENTER("open_table_def");
-  DBUG_PRINT("enter", ("name: '%s.%s'",share->db.str, share->table_name.str));
+  DBUG_PRINT("enter", ("table: '%s'.'%s'  path: '%s'", share->db.str,
+                       share->table_name.str, share->normalized_path.str));
 
   error= 1;
   error_given= 0;
diff --git a/storage/innobase/row/row0mysql.c b/storage/innobase/row/row0mysql.c
index 58d86790c0a..18d12d66c29 100644
--- a/storage/innobase/row/row0mysql.c
+++ b/storage/innobase/row/row0mysql.c
@@ -3414,8 +3414,8 @@ row_is_mysql_tmp_table_name(
 	const char*	name)	/* in: table name in the form
 				'database/tablename' */
 {
-	/* return(strstr(name, "/#sql") != NULL); */
-	return(strstr(name, "/@0023sql") != NULL);
+	return(strstr(name, "/#sql") != NULL);
+	/* return(strstr(name, "/@0023sql") != NULL); */
 }
 
 /********************************************************************

From efcf996f88d2764f7a9c96971cd573cf2a01161a Mon Sep 17 00:00:00 2001
From: unknown <ingo/istruewing@chilla.local>
Date: Wed, 2 Aug 2006 18:39:21 +0200
Subject: [PATCH 14/19] Bug#18775 - Temporary table from alter table visible to
 other threads Reverting part of the patch. NDB has unencoded names in their
 data dictionary.

---
 sql/sql_table.cc | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 2a6f30a81dc..9d28e0496b1 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3435,13 +3435,9 @@ bool mysql_create_table_internal(THD *thd,
   */
   if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
   {
-    char dbbuff[FN_REFLEN];
-    char tbbuff[FN_REFLEN];
     bool create_if_not_exists =
       create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS;
-    VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
-    VOID(tablename_to_filename(table_name, tbbuff, sizeof(tbbuff)));
-    if (ha_table_exists_in_engine(thd, dbbuff, tbbuff))
+    if (ha_table_exists_in_engine(thd, db, table_name))
     {
       DBUG_PRINT("info", ("Table with same name already existed in handler"));
 

From ce4b9c82daad6662400d64f4113e2b2700166af7 Mon Sep 17 00:00:00 2001
From: unknown <ingo/istruewing@chilla.local>
Date: Thu, 3 Aug 2006 08:12:56 +0200
Subject: [PATCH 15/19] Bug#18775 - Temporary table from alter table visible to
 other threads New test cases. Names with umlauts don't compare well on
 Windows.

mysql-test/r/alter_table.result:
  Bug#18775 - Temporary table from alter table visible to other threads
  New test results
mysql-test/r/backup.result:
  Bug#18775 - Temporary table from alter table visible to other threads
  New test results
mysql-test/t/alter_table.test:
  Bug#18775 - Temporary table from alter table visible to other threads
  New test case. Names with umlauts don't compare well on Windows.
mysql-test/t/backup.test:
  Bug#18775 - Temporary table from alter table visible to other threads
  New test case. Names with umlauts don't compare well on Windows.
---
 mysql-test/r/alter_table.result | 55 ++++++++++++++++++---------------
 mysql-test/r/backup.result      | 20 ++++++------
 mysql-test/t/alter_table.test   | 39 +++++++++--------------
 mysql-test/t/backup.test        | 16 +++++-----
 4 files changed, 63 insertions(+), 67 deletions(-)

diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result
index 3095d5337ed..d3657d84678 100644
--- a/mysql-test/r/alter_table.result
+++ b/mysql-test/r/alter_table.result
@@ -657,43 +657,45 @@ SELECT * FROM t1;
 v	b
 abc	5
 DROP TABLE t1;
-DROP DATABASE IF EXISTS mysqltest;
-CREATE DATABASE mysqltest;
-use mysqltest;
-DROP TABLE IF EXISTS `t1_n�gel`, `t1_bl�ten`;
-CREATE TABLE `t1_n�gel` (c1 INT);
-ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
-CREATE TABLE `t1_n�gel` (c1 INT);
-ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
-ERROR 42S01: Table 't1_blЭten' already exists
-DROP TABLE   `t1_n�gel`, `t1_bl�ten`;
-CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
-ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
-CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
-ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
-ERROR 42S01: Table 'tt1_blЭten' already exists
-SHOW CREATE TABLE `tt1_bl�ten`;
+DROP TABLE IF EXISTS `t+1`, `t+2`;
+CREATE TABLE `t+1` (c1 INT);
+ALTER TABLE  `t+1` RENAME `t+2`;
+CREATE TABLE `t+1` (c1 INT);
+ALTER TABLE  `t+1` RENAME `t+2`;
+ERROR 42S01: Table 't+2' already exists
+DROP TABLE   `t+1`, `t+2`;
+CREATE TEMPORARY TABLE `tt+1` (c1 INT);
+ALTER TABLE  `tt+1` RENAME `tt+2`;
+CREATE TEMPORARY TABLE `tt+1` (c1 INT);
+ALTER TABLE  `tt+1` RENAME `tt+2`;
+ERROR 42S01: Table 'tt+2' already exists
+SHOW CREATE TABLE `tt+1`;
 Table	Create Table
-tt1_bl�ten	CREATE TEMPORARY TABLE `tt1_bl�ten` (
+tt+1	CREATE TEMPORARY TABLE `tt+1` (
   `c1` int(11) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
-DROP TABLE   `tt1_n�gel`, `tt1_bl�ten`;
+SHOW CREATE TABLE `tt+2`;
+Table	Create Table
+tt+2	CREATE TEMPORARY TABLE `tt+2` (
+  `c1` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE   `tt+1`, `tt+2`;
 CREATE TABLE `#sql1` (c1 INT);
 CREATE TABLE `@0023sql2` (c1 INT);
 SHOW TABLES;
-Tables_in_mysqltest
+Tables_in_test
 #sql1
 @0023sql2
 RENAME TABLE `#sql1`     TO `@0023sql1`;
 RENAME TABLE `@0023sql2` TO `#sql2`;
 SHOW TABLES;
-Tables_in_mysqltest
+Tables_in_test
 #sql2
 @0023sql1
 ALTER TABLE `@0023sql1`  RENAME `#sql-1`;
 ALTER TABLE `#sql2`      RENAME `@0023sql-2`;
 SHOW TABLES;
-Tables_in_mysqltest
+Tables_in_test
 #sql-1
 @0023sql-2
 INSERT INTO `#sql-1`     VALUES (1);
@@ -702,18 +704,21 @@ DROP TABLE `#sql-1`, `@0023sql-2`;
 CREATE TEMPORARY TABLE `#sql1` (c1 INT);
 CREATE TEMPORARY TABLE `@0023sql2` (c1 INT);
 SHOW TABLES;
-Tables_in_mysqltest
+Tables_in_test
 ALTER TABLE `#sql1`      RENAME `@0023sql1`;
 ALTER TABLE `@0023sql2`  RENAME `#sql2`;
 SHOW TABLES;
-Tables_in_mysqltest
+Tables_in_test
 INSERT INTO `#sql2`      VALUES (1);
 INSERT INTO `@0023sql1`  VALUES (2);
+SHOW CREATE TABLE `#sql2`;
+Table	Create Table
+#sql2	CREATE TEMPORARY TABLE `#sql2` (
+  `c1` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
 SHOW CREATE TABLE `@0023sql1`;
 Table	Create Table
 @0023sql1	CREATE TEMPORARY TABLE `@0023sql1` (
   `c1` int(11) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 DROP TABLE `#sql2`, `@0023sql1`;
-use test;
-DROP DATABASE mysqltest;
diff --git a/mysql-test/r/backup.result b/mysql-test/r/backup.result
index 05761240ca7..a4d1b18fe61 100644
--- a/mysql-test/r/backup.result
+++ b/mysql-test/r/backup.result
@@ -101,23 +101,23 @@ test.t5	backup	status	OK
 Warnings:
 Warning	1541	The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
 drop table t5;
-DROP TABLE IF EXISTS `t-bl�ten`;
-CREATE  TABLE `t-bl�ten` (c1 INT);
-INSERT  INTO  `t-bl�ten` VALUES (1), (2), (3);
-BACKUP  TABLE `t-bl�ten` TO '../tmp';
+DROP TABLE IF EXISTS `t+1`;
+CREATE  TABLE `t+1` (c1 INT);
+INSERT  INTO  `t+1` VALUES (1), (2), (3);
+BACKUP  TABLE `t+1` TO '../tmp';
 Table	Op	Msg_type	Msg_text
-test.t-bl�ten	backup	status	OK
+test.t+1	backup	status	OK
 Warnings:
 Warning	1541	The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
-DROP    TABLE `t-bl�ten`;
-RESTORE TABLE `t-bl�ten` FROM '../tmp';
+DROP    TABLE `t+1`;
+RESTORE TABLE `t+1` FROM '../tmp';
 Table	Op	Msg_type	Msg_text
-test.t-bl�ten	restore	status	OK
+test.t+1	restore	status	OK
 Warnings:
 Warning	1541	The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 5.2. Please use MySQL Administrator (mysqldump, mysql) instead.
-SELECT * FROM `t-bl�ten`;
+SELECT * FROM `t+1`;
 c1
 1
 2
 3
-DROP    TABLE `t-bl�ten`;
+DROP    TABLE `t+1`;
diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test
index f6af92e0044..168d011a2ac 100644
--- a/mysql-test/t/alter_table.test
+++ b/mysql-test/t/alter_table.test
@@ -488,32 +488,26 @@ DROP TABLE t1;
 #
 # Bug#18775 - Temporary table from alter table visible to other threads
 #
-# Use a special database to avoid name clashes with user tables.
+# Check if special characters work and duplicates are detected.
 --disable_warnings
-DROP DATABASE IF EXISTS mysqltest;
+DROP TABLE IF EXISTS `t+1`, `t+2`;
 --enable_warnings
-CREATE DATABASE mysqltest;
-use mysqltest;
-#
-# Check if non-ASCII alphabetic characters work and duplicates are detected.
---disable_warnings
-DROP TABLE IF EXISTS `t1_n�gel`, `t1_bl�ten`;
---enable_warnings
-CREATE TABLE `t1_n�gel` (c1 INT);
-ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
-CREATE TABLE `t1_n�gel` (c1 INT);
+CREATE TABLE `t+1` (c1 INT);
+ALTER TABLE  `t+1` RENAME `t+2`;
+CREATE TABLE `t+1` (c1 INT);
 --error ER_TABLE_EXISTS_ERROR
-ALTER TABLE  `t1_n�gel` RENAME `t1_bl�ten`;
-DROP TABLE   `t1_n�gel`, `t1_bl�ten`;
+ALTER TABLE  `t+1` RENAME `t+2`;
+DROP TABLE   `t+1`, `t+2`;
 #
 # Same for temporary tables though these names do not become file names.
-CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
-ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
-CREATE TEMPORARY TABLE `tt1_n�gel` (c1 INT);
+CREATE TEMPORARY TABLE `tt+1` (c1 INT);
+ALTER TABLE  `tt+1` RENAME `tt+2`;
+CREATE TEMPORARY TABLE `tt+1` (c1 INT);
 --error ER_TABLE_EXISTS_ERROR
-ALTER TABLE  `tt1_n�gel` RENAME `tt1_bl�ten`;
-SHOW CREATE TABLE `tt1_bl�ten`;
-DROP TABLE   `tt1_n�gel`, `tt1_bl�ten`;
+ALTER TABLE  `tt+1` RENAME `tt+2`;
+SHOW CREATE TABLE `tt+1`;
+SHOW CREATE TABLE `tt+2`;
+DROP TABLE   `tt+1`, `tt+2`;
 #
 # Check if special characters as in tmp_file_prefix work.
 CREATE TABLE `#sql1` (c1 INT);
@@ -538,10 +532,7 @@ ALTER TABLE `@0023sql2`  RENAME `#sql2`;
 SHOW TABLES;
 INSERT INTO `#sql2`      VALUES (1);
 INSERT INTO `@0023sql1`  VALUES (2);
+SHOW CREATE TABLE `#sql2`;
 SHOW CREATE TABLE `@0023sql1`;
 DROP TABLE `#sql2`, `@0023sql1`;
-#
-# Cleanup
-use test;
-DROP DATABASE mysqltest;
 
diff --git a/mysql-test/t/backup.test b/mysql-test/t/backup.test
index fa6bbc21813..61bde0cecb0 100644
--- a/mysql-test/t/backup.test
+++ b/mysql-test/t/backup.test
@@ -65,15 +65,15 @@ drop table t5;
 #
 # Backup did not encode table names.
 --disable_warnings
-DROP TABLE IF EXISTS `t-bl�ten`;
+DROP TABLE IF EXISTS `t+1`;
 --enable_warnings
-CREATE  TABLE `t-bl�ten` (c1 INT);
-INSERT  INTO  `t-bl�ten` VALUES (1), (2), (3);
-BACKUP  TABLE `t-bl�ten` TO '../tmp';
-DROP    TABLE `t-bl�ten`;
+CREATE  TABLE `t+1` (c1 INT);
+INSERT  INTO  `t+1` VALUES (1), (2), (3);
+BACKUP  TABLE `t+1` TO '../tmp';
+DROP    TABLE `t+1`;
 #
 # Same for restore.
-RESTORE TABLE `t-bl�ten` FROM '../tmp';
-SELECT * FROM `t-bl�ten`;
-DROP    TABLE `t-bl�ten`;
+RESTORE TABLE `t+1` FROM '../tmp';
+SELECT * FROM `t+1`;
+DROP    TABLE `t+1`;
 

From e60678aef6e5ae7c9ddb03a3ab8ccb68689a9801 Mon Sep 17 00:00:00 2001
From: unknown <andrey@lmy004.>
Date: Fri, 4 Aug 2006 12:50:49 +0200
Subject: [PATCH 16/19] Fix for bug#21416 SP: Recursion level higher than zero
 needed for non-recursive call

The following procedure was not possible if max_sp_recursion_depth is 0
create procedure show_proc() show create procedure show_proc;

Actually there is no recursive call but the limit is checked.

Solved by temporarily increasing the thread's limit just before the fetch from cache
and decreasing after that.


mysql-test/r/sp.result:
  update result
mysql-test/t/sp.test:
  Test for bug #21416 SP: Recursion level higher than zero needed for non-recursive call
sql/sp.cc:
  Increase the max_sp_recursion_depth temporarily for SHOW CREATE PROCEDURE call.
  This call is in fact not recursive but is counted as such. Outcome, it will work
  always but if max_sp_recursion_depth is reached we are going to cache one more
  sp_head instance.
---
 mysql-test/r/sp.result |  7 +++++++
 mysql-test/t/sp.test   | 10 ++++++++++
 sql/sp.cc              | 21 +++++++++++++++------
 3 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index db72d190441..3ef1066ecda 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -5051,4 +5051,11 @@ concat('data was: /', var1, '/')
 data was: /1/
 drop table t3|
 drop procedure bug15217|
+drop procedure if exists bug21416|
+create procedure bug21416() show create procedure bug21416|
+call bug21416()|
+Procedure	sql_mode	Create Procedure
+bug21416		CREATE DEFINER=`root`@`localhost` PROCEDURE `bug21416`()
+show create procedure bug21416
+drop procedure bug21416|
 drop table t1,t2;
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index 99f3bbbbd14..fcf179d3e8f 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -5950,6 +5950,16 @@ call bug15217()|
 drop table t3|
 drop procedure bug15217|
 
+#
+# BUG#21416: SP: Recursion level higher than zero needed for non-recursive call
+#
+--disable_warnings
+drop procedure if exists bug21416|
+--enable_warnings
+create procedure bug21416() show create procedure bug21416|
+call bug21416()|
+drop procedure bug21416|
+
 #
 # BUG#NNNN: New bug synopsis
 #
diff --git a/sql/sp.cc b/sql/sp.cc
index e794a461402..bea4eb12836 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -992,6 +992,12 @@ sp_find_routine(THD *thd, int type, sp_name *name, sp_cache **cp,
       }
       DBUG_RETURN(sp->m_first_free_instance);
     }
+    /*
+      Actually depth could be +1 than the actual value in case a SP calls
+      SHOW CREATE PROCEDURE. Hence, the linked list could hold up to one more
+      instance.
+    */
+
     level= sp->m_last_cached_sp->m_recursion_level + 1;
     if (level > depth)
     {
@@ -1161,19 +1167,22 @@ sp_update_procedure(THD *thd, sp_name *name, st_sp_chistics *chistics)
 int
 sp_show_create_procedure(THD *thd, sp_name *name)
 {
+  int ret= SP_KEY_NOT_FOUND;
   sp_head *sp;
   DBUG_ENTER("sp_show_create_procedure");
   DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
 
+  /*
+    Increase the recursion limit for this statement. SHOW CREATE PROCEDURE
+    does not do actual recursion.  
+  */
+  thd->variables.max_sp_recursion_depth++;
   if ((sp= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
                            &thd->sp_proc_cache, FALSE)))
-  {
-    int ret= sp->show_create_procedure(thd);
+    ret= sp->show_create_procedure(thd);
 
-    DBUG_RETURN(ret);
-  }
-
-  DBUG_RETURN(SP_KEY_NOT_FOUND);
+  thd->variables.max_sp_recursion_depth--;
+  DBUG_RETURN(ret);
 }
 
 

From 0231ca09b52bab67e2a351505b00b03a83cdf939 Mon Sep 17 00:00:00 2001
From: unknown <andrey@lmy004.>
Date: Wed, 9 Aug 2006 17:07:59 +0200
Subject: [PATCH 17/19] Fix for bug#20701 BINARY keyword should be forbidden in
 stored routines

create function func() returns char(10) binary ...
is no more possible. This will be reenabled when
bug 2676 "DECLARE can't have COLLATE clause in stored procedure"
is fixed.

Fix after 2nd review


mysql-test/r/sp-error.result:
  update result
mysql-test/r/sp.result:
  update result
mysql-test/t/sp-error.test:
  add a test case for bug#20701 BINARY keyword should be forbidden in stored procedures
mysql-test/t/sp.test:
  Fix test case which uses binary for the return value of a function.
  It's no more possible after fix for bug#20701
  BINARY keyword should be forbidden in SP

  Fix few glitches where ; is used instead of | . The delimiter is |
sql/sql_yacc.yy:
  Fix for bug#20701 BINARY keyword should be forbidden in stored routines

  create function func() returns char(10) binary ...
  is no more possible. This will be reenabled when
  bug 2676 "DECLARE can't have COLLATE clause in stored procedure"
  is fixed
---
 mysql-test/r/sp-error.result |  5 +++++
 mysql-test/r/sp.result       | 14 ++++++++++----
 mysql-test/t/sp-error.test   | 18 ++++++++++++++++++
 mysql-test/t/sp.test         | 19 +++++++++++++++----
 sql/sql_yacc.yy              | 11 +++++++++++
 5 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result
index bf36b4796b9..63401845f23 100644
--- a/mysql-test/r/sp-error.result
+++ b/mysql-test/r/sp-error.result
@@ -1181,3 +1181,8 @@ show authors;
 return 42;
 end|
 ERROR 0A000: Not allowed to return a result set from a function
+drop function if exists bug20701|
+create function bug20701() returns varchar(25) binary return "test"|
+ERROR 42000: This version of MySQL doesn't yet support 'return value collation'
+create function bug20701() returns varchar(25) return "test"|
+drop function bug20701|
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index 3ef1066ecda..e51ebaa4e94 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -3620,12 +3620,18 @@ call bug11333(10)|
 drop procedure bug11333|
 drop table t3|
 drop function if exists bug9048|
-create function bug9048(f1 char binary) returns char binary
+create function bug9048(f1 char binary) returns char
 begin
 set f1= concat( 'hello', f1 );
 return f1;
 end|
 drop function bug9048|
+create function bug9048(f1 char binary) returns char binary
+begin
+set f1= concat( 'hello', f1 );
+return f1;
+end|
+ERROR 42000: This version of MySQL doesn't yet support 'return value collation'
 drop procedure if exists bug12849_1|
 create procedure bug12849_1(inout x char) select x into x|
 set @var='a'|
@@ -4074,7 +4080,7 @@ select res;
 end|
 create table t3 (a int)|
 insert into t3 values (0)|
-create view v1 as select a from t3;
+create view v1 as select a from t3|
 create procedure bug10100pt(level int, lim int)
 begin
 if level < lim then
@@ -4095,7 +4101,7 @@ else
 select * from v1;
 end if;
 end|
-prepare stmt2 from "select * from t3;";
+prepare stmt2 from "select * from t3;"|
 create procedure bug10100pd(level int, lim int)
 begin
 if level < lim then
@@ -4465,7 +4471,7 @@ Error	1347	'test.v1' is not BASE TABLE
 Error	1347	'test.v1' is not BASE TABLE
 Error	1347	'test.v1' is not BASE TABLE
 drop procedure bug13012|
-drop view v1;
+drop view v1|
 select * from t1 order by data|
 id	data
 aa	0
diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test
index d370cb3037c..73a64b6feeb 100644
--- a/mysql-test/t/sp-error.test
+++ b/mysql-test/t/sp-error.test
@@ -1728,10 +1728,28 @@ begin
   return 42;
 end|
 
+#
+# BUG#20701: BINARY keyword should be forbidden in stored routines
+#
+--disable_warnings
+drop function if exists bug20701|
+--enable_warnings
+#
+# This was disabled in 5.1.12. See bug #20701
+# When collation support in SP is implemented, then this test should
+# be removed.
+#
+--error ER_NOT_SUPPORTED_YET
+create function bug20701() returns varchar(25) binary return "test"|
+create function bug20701() returns varchar(25) return "test"|
+drop function bug20701|
+
 #
 # BUG#NNNN: New bug synopsis
 #
 #--disable_warnings
 #drop procedure if exists bugNNNN|
+#drop function if exists bugNNNN|
 #--enable_warnings
 #create procedure bugNNNN...
+#create function bugNNNN...
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index fcf179d3e8f..6ae7319e433 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -4381,12 +4381,23 @@ drop table t3|
 --disable_warnings
 drop function if exists bug9048|
 --enable_warnings
-create function bug9048(f1 char binary) returns char binary
+create function bug9048(f1 char binary) returns char
 begin
   set f1= concat( 'hello', f1 );
   return f1;
 end|
 drop function bug9048|
+#
+# This was disabled in 5.1.12. See bug #20701
+# When collation support in SP is implemented, then this test should
+# be removed.
+#
+--error ER_NOT_SUPPORTED_YET
+create function bug9048(f1 char binary) returns char binary
+begin
+  set f1= concat( 'hello', f1 );
+  return f1;
+end|
 
 # Bug #12849 Stored Procedure: Crash on procedure call with CHAR type
 # 'INOUT' parameter
@@ -4940,7 +4951,7 @@ end|
 # a procedure which use tables and recursion
 create table t3 (a int)|
 insert into t3 values (0)|
-create view v1 as select a from t3;
+create view v1 as select a from t3|
 create procedure bug10100pt(level int, lim int)
 begin
   if level < lim then
@@ -4963,7 +4974,7 @@ begin
   end if;
 end|
 # dynamic sql & recursion
-prepare stmt2 from "select * from t3;";
+prepare stmt2 from "select * from t3;"|
 create procedure bug10100pd(level int, lim int)
 begin
   if level < lim then
@@ -5258,7 +5269,7 @@ call bug13012()|
 call bug13012()|
 call bug13012()|
 drop procedure bug13012|
-drop view v1;
+drop view v1|
 select * from t1 order by data|
 
 #
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index ff422c4418c..d94281ed9cc 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1672,6 +1672,17 @@ create_function_tail:
 	  {
 	    LEX *lex= Lex;
 	    sp_head *sp= lex->sphead;
+            /*
+              This was disabled in 5.1.12. See bug #20701
+              When collation support in SP is implemented, then this test
+              should be removed.
+            */
+            if (($8 == FIELD_TYPE_STRING || $8 == MYSQL_TYPE_VARCHAR)
+                && (lex->type & BINCMP_FLAG))
+            {
+              my_error(ER_NOT_SUPPORTED_YET, MYF(0), "return value collation");
+              YYABORT;
+            }
 
             if (sp->fill_field_definition(YYTHD, lex,
                                           (enum enum_field_types) $8,

From 2834469c17041545fc0e2c52d7862ce649222fab Mon Sep 17 00:00:00 2001
From: unknown <andrey@example.com>
Date: Thu, 10 Aug 2006 11:52:34 +0200
Subject: [PATCH 18/19] after merge update

mysql-test/r/mysqldump.result:
  update result
mysql-test/t/mysqldump.test:
  update test
---
 mysql-test/r/mysqldump.result | 2 +-
 mysql-test/r/sp.result        | 7 +++++++
 mysql-test/t/mysqldump.test   | 2 +-
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index f01d8f6160e..153ddb7ca2b 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -2279,7 +2279,7 @@ INSERT INTO t1 VALUES(1), (2), (3), (4), (5);
 CREATE FUNCTION `bug9056_func1`(a INT, b INT) RETURNS int(11) RETURN a+b //
 CREATE PROCEDURE `bug9056_proc1`(IN a INT, IN b INT, OUT c INT)
 BEGIN SELECT a+b INTO c; end  //
-create function bug9056_func2(f1 char binary) returns char binary
+create function bug9056_func2(f1 char binary) returns char
 begin
 set f1= concat( 'hello', f1 );
 return f1;
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index ec4065fbc1d..8ff180044df 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -3620,11 +3620,18 @@ call bug11333(10)|
 drop procedure bug11333|
 drop table t3|
 drop function if exists bug9048|
+create function bug9048(f1 char binary) returns char
+begin
+set f1= concat( 'hello', f1 );
+return f1;
+end|
+drop function bug9048|
 create function bug9048(f1 char binary) returns char binary
 begin
 set f1= concat( 'hello', f1 );
 return f1;
 end|
+ERROR 42000: This version of MySQL doesn't yet support 'return value collation'
 drop procedure if exists bug12849_1|
 create procedure bug12849_1(inout x char) select x into x|
 set @var='a'|
diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
index 8acc29fcc50..c40a21e0ca0 100644
--- a/mysql-test/t/mysqldump.test
+++ b/mysql-test/t/mysqldump.test
@@ -951,7 +951,7 @@ CREATE FUNCTION `bug9056_func1`(a INT, b INT) RETURNS int(11) RETURN a+b //
 CREATE PROCEDURE `bug9056_proc1`(IN a INT, IN b INT, OUT c INT)
 BEGIN SELECT a+b INTO c; end  //
 
-create function bug9056_func2(f1 char binary) returns char binary
+create function bug9056_func2(f1 char binary) returns char
 begin
   set f1= concat( 'hello', f1 );
   return f1;

From 5b7f05dea70fc47046497c86a16b4f6213a666c1 Mon Sep 17 00:00:00 2001
From: unknown <andrey@example.com>
Date: Thu, 10 Aug 2006 12:26:43 +0200
Subject: [PATCH 19/19] revert part of the code how did it get in?!? (it's only
 in local csets so no other tree is affected)

sql/sp.cc:
  revert this patch.
  how did it get in?!? (it's only in local csets so no other tree is affected)
---
 sql/sp.cc | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/sql/sp.cc b/sql/sp.cc
index d8bbd97f601..f60a167e39a 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -992,11 +992,6 @@ sp_find_routine(THD *thd, int type, sp_name *name, sp_cache **cp,
       }
       DBUG_RETURN(sp->m_first_free_instance);
     }
-    /*
-      Actually depth could be +1 than the actual value in case a SP calls
-      SHOW CREATE PROCEDURE. Hence, the linked list could hold up to one more
-      instance.
-    */
 
     level= sp->m_last_cached_sp->m_recursion_level + 1;
     if (level > depth)
@@ -1172,16 +1167,10 @@ sp_show_create_procedure(THD *thd, sp_name *name)
   DBUG_ENTER("sp_show_create_procedure");
   DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
 
-  /*
-    Increase the recursion limit for this statement. SHOW CREATE PROCEDURE
-    does not do actual recursion.  
-  */
-  thd->variables.max_sp_recursion_depth++;
   if ((sp= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
                            &thd->sp_proc_cache, FALSE)))
     ret= sp->show_create_procedure(thd);
 
-  thd->variables.max_sp_recursion_depth--;
   DBUG_RETURN(ret);
 }