From b24fd86a91519c879c8c31fad9f918d3847ca797 Mon Sep 17 00:00:00 2001
From: "hf@deer.(none)" <>
Date: Sat, 21 Jun 2003 20:17:50 +0500
Subject: [PATCH 1/3] Fix for bug #628

---
 sql/item_strfunc.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 208be1ecd7f..1edd0e68687 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1482,7 +1482,7 @@ String *Item_func_format::val_str(String *str)
     str= copy_if_not_alloced(&tmp_str,str,length);
     str->length(length);
     tmp= (char*) str->ptr()+length - dec-1;
-    for (pos= (char*) str->ptr()+length ; pos != tmp; pos--)
+    for (pos= (char*) str->ptr()+length-1; pos != tmp; pos--)
       pos[0]= pos[-(int) diff];
     while (diff)
     {

From 0cdf7f39af33767fa5cd1b6bbedb14400ea3ad6c Mon Sep 17 00:00:00 2001
From: "hf@deer.(none)" <>
Date: Thu, 3 Jul 2003 10:42:13 +0500
Subject: [PATCH 2/3] Proposed bugfix for #717 Current table is placed into
 read_tables set of the current join_tab->select so get_mm_parts function
 thinks that current table's record is read and tries to calculate WHERE
 condition with the fields of the record. Result of these calculations is
 unpredictable. Looks funny - outcome of the SELECT depends on the queries
 executed before.

Anyway i think we should have testcase on this part of the code.
---
 mysql-test/r/sel000001.result | 14 ++++++++++++++
 mysql-test/t/sel000001.test   | 13 +++++++++++++
 sql/sql_select.cc             |  2 +-
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/sel000001.result b/mysql-test/r/sel000001.result
index 28f6d3d1d5a..6b6b9b7dffc 100644
--- a/mysql-test/r/sel000001.result
+++ b/mysql-test/r/sel000001.result
@@ -5,3 +5,17 @@ SELECT s, id FROM t1 WHERE s = 'mouse';
 s	id
 mouse	3
 drop table t1;
+CREATE TABLE t1 (
+node int(11) NOT NULL default '0',
+maxchild int(11) NOT NULL default '0',
+PRIMARY KEY  (`node`)
+);
+INSERT INTO t1 (node, maxchild) VALUES (4,4),(5,5),(1,244);
+SELECT * FROM t1 g1, t1 g2 
+WHERE g1.node <= g2.node and g2.node <= g1.maxchild and g2.node = g2.maxchild;
+node	maxchild	node	maxchild
+4	4	4	4
+5	5	5	5
+1	244	4	4
+1	244	5	5
+DROP TABLE t1;
diff --git a/mysql-test/t/sel000001.test b/mysql-test/t/sel000001.test
index 77355f8d535..ad4af1f92fb 100644
--- a/mysql-test/t/sel000001.test
+++ b/mysql-test/t/sel000001.test
@@ -16,3 +16,16 @@ CREATE TABLE t1 (s CHAR(20) PRIMARY KEY, id INT);
 INSERT INTO t1 VALUES ('cat', 1), ('mouse', 3), ('dog', 2), ('snake', 77);
 SELECT s, id FROM t1 WHERE s = 'mouse';
 drop table t1;
+
+#
+#test for bug #717
+#
+CREATE TABLE t1 (
+  node int(11) NOT NULL default '0',
+  maxchild int(11) NOT NULL default '0',
+  PRIMARY KEY  (`node`)
+);
+INSERT INTO t1 (node, maxchild) VALUES (4,4),(5,5),(1,244);
+SELECT * FROM t1 g1, t1 g2 
+ WHERE g1.node <= g2.node and g2.node <= g1.maxchild and g2.node = g2.maxchild;
+DROP TABLE t1;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5b5972be384..bde5392d299 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2683,7 +2683,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
 			      (select->quick &&
 			       (select->quick->records >= 100L)))) ?
 	      2 : 1;
-	    sel->read_tables= used_tables;
+	    sel->read_tables= used_tables & ~current_map;
 	  }
 	  if (i != join->const_tables && tab->use_quick != 2)
 	  {					/* Read with cache */

From 95d6b7a5ea235c9ac29264598d6672a7031cc4ee Mon Sep 17 00:00:00 2001
From: "hf@deer.(none)" <>
Date: Thu, 3 Jul 2003 16:48:47 +0500
Subject: [PATCH 3/3] Testcase for #628

---
 mysql-test/r/func_misc.result | 3 +++
 mysql-test/t/func_misc.test   | 5 +++++
 2 files changed, 8 insertions(+)

diff --git a/mysql-test/r/func_misc.result b/mysql-test/r/func_misc.result
index 8d05adcc1ba..d51bea020ed 100644
--- a/mysql-test/r/func_misc.result
+++ b/mysql-test/r/func_misc.result
@@ -13,3 +13,6 @@ NULL	255.255.1.255	0.0.1.255
 select length(format('nan', 2)) > 0;
 length(format('nan', 2)) > 0
 1
+select concat("$",format(2500,2));
+concat("$",format(2500,2))
+$2,500.00
diff --git a/mysql-test/t/func_misc.test b/mysql-test/t/func_misc.test
index be64c170fa1..d15c26279ec 100644
--- a/mysql-test/t/func_misc.test
+++ b/mysql-test/t/func_misc.test
@@ -12,3 +12,8 @@ select inet_ntoa(1099511627775),inet_ntoa(4294902271),inet_ntoa(511);
 # Test for core dump with nan
 #
 select length(format('nan', 2)) > 0;
+
+#
+# Test for bug #628
+#
+select concat("$",format(2500,2));