From 2e887f794a846c8463e5fa6a5098a390d5c25d1a Mon Sep 17 00:00:00 2001
From: unknown <hf@deer.(none)>
Date: Thu, 13 Oct 2005 19:23:52 +0500
Subject: [PATCH 1/4] Fix for bug #3874 (Group by field is not considered)

mysql-test/r/select.result:
  test result fixed
mysql-test/t/select.test:
  test case added
sql/sql_select.cc:
  do the same for nullable
---
 mysql-test/r/select.result | 36 ++++++++++++++++++++++++++++++++++++
 mysql-test/t/select.test   | 21 +++++++++++++++++++++
 sql/sql_select.cc          |  2 +-
 3 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 299e0b6bf33..11a50d6cabc 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -2441,3 +2441,39 @@ a	c
 SELECT a, b AS c FROM t1 ORDER BY b+1;
 a	c
 drop table t1;
+DROP TABLE IF EXISTS t1, t2;
+CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
+INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
+CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );
+INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),
+(1,2,3);
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
+a	b	c	d
+1	2	1	1
+1	2	2	1
+1	2	3	1
+1	10		2
+1	11		2
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t1.a, t1.b, c;
+a	b	c	d
+1	10		4
+1	2	1	1
+1	2	2	1
+1	2	3	1
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t2.a, t2.b, c;
+a	b	c	d
+1	2	1	1
+1	2	2	1
+1	2	3	1
+1	10		2
+1	11		2
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1
+WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
+a	b	c	d
+1	2	1	1
+1	2	2	1
+1	2	3	1
+DROP TABLE IF EXISTS t1, t2;
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index 2adf4f1749c..2607a00bed4 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -1992,3 +1992,24 @@ CREATE TABLE t1 (a INT, b INT);
 SELECT a, b AS c FROM t1 ORDER BY c+1;
 SELECT a, b AS c FROM t1 ORDER BY b+1;
 drop table t1;
+
+#
+# Bug #3874 (function in GROUP and LEFT JOIN)
+#
+
+DROP TABLE IF EXISTS t1, t2;
+CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
+INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
+CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );
+INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),
+ (1,2,3);
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t1.a, t1.b, c;
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
+t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t2.a, t2.b, c;
+SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1
+WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
+DROP TABLE IF EXISTS t1, t2;
+
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5292a1fc0e0..7c2c233d754 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -3115,7 +3115,7 @@ eq_ref_table(JOIN *join, ORDER *start_order, JOIN_TAB *tab)
   tab->cached_eq_ref_table=1;
   if (tab->type == JT_CONST)			// We can skip const tables
     return (tab->eq_ref_table=1);		/* purecov: inspected */
-  if (tab->type != JT_EQ_REF)
+  if (tab->type != JT_EQ_REF || tab->table->maybe_null)
     return (tab->eq_ref_table=0);		// We must use this
   Item **ref_item=tab->ref.items;
   Item **end=ref_item+tab->ref.key_parts;

From d853ecd67c10a0ed59d203ee75a09341fe80dbac Mon Sep 17 00:00:00 2001
From: unknown <monty@mysql.com>
Date: Thu, 13 Oct 2005 17:41:55 +0300
Subject: [PATCH 2/4] Review of new pushed code - No need to check *ref when
 ref is checked (Simple optimization fix)

sql/item.cc:
  No need to check *ref
---
 sql/item.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sql/item.cc b/sql/item.cc
index c3845db904c..38b6516b742 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -351,8 +351,8 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables)
     {
       if (thd->lex.select_lex.is_item_list_lookup)
       {
-        Item** res= find_item_in_list(this, thd->lex.select_lex.item_list);
-        if (res && *res && (*res)->type() == Item::FIELD_ITEM)
+        Item **res= find_item_in_list(this, thd->lex.select_lex.item_list);
+        if (res && (*res)->type() == Item::FIELD_ITEM)
         {
           set_field((*((Item_field**)res))->field);
           return 0;

From 3d332ea76f46153b6b9964bb5dfd2aa21c5d4864 Mon Sep 17 00:00:00 2001
From: unknown <hf@deer.(none)>
Date: Thu, 13 Oct 2005 19:51:07 +0500
Subject: [PATCH 3/4] merging

---
 mysql-test/r/select.result | 55 --------------------------------------
 mysql-test/t/select.test   |  1 -
 2 files changed, 56 deletions(-)

diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 025bd1c6ba5..be46d180f2d 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -2653,60 +2653,6 @@ t11	MyISAM	9	Dynamic	0	0	X	X	X	X	X	X	X	X	latin1_swedish_ci	NULL
 select 123 as a from t1 where f1 is null;
 a
 drop table t1,t11;
-CREATE TABLE t1 (
-kunde_intern_id int(10) unsigned NOT NULL default '0',
-kunde_id int(10) unsigned NOT NULL default '0',
-FK_firma_id int(10) unsigned NOT NULL default '0',
-aktuell enum('Ja','Nein') NOT NULL default 'Ja',
-vorname varchar(128) NOT NULL default '',
-nachname varchar(128) NOT NULL default '',
-geloescht enum('Ja','Nein') NOT NULL default 'Nein',
-firma varchar(128) NOT NULL default ''
-);
-INSERT INTO t1 VALUES 
-(3964,3051,1,'Ja','Vorname1','1Nachname','Nein','Print Schau XXXX'),
-(3965,3051111,1,'Ja','Vorname1111','1111Nachname','Nein','Print Schau XXXX');
-SELECT kunde_id ,FK_firma_id ,aktuell, vorname, nachname, geloescht FROM t1
-WHERE
-(
-(
-( '' != '' AND firma LIKE CONCAT('%', '', '%'))
-OR
-(vorname LIKE CONCAT('%', 'Vorname1', '%') AND 
-nachname LIKE CONCAT('%', '1Nachname', '%') AND 
-'Vorname1' != '' AND 'xxxx' != '')
-)
-AND
-(
-aktuell = 'Ja' AND geloescht = 'Nein' AND FK_firma_id = 2
-)
-)
-;
-kunde_id	FK_firma_id	aktuell	vorname	nachname	geloescht
-SELECT kunde_id ,FK_firma_id ,aktuell, vorname, nachname,
-geloescht FROM t1
-WHERE
-(
-(
-aktuell = 'Ja' AND geloescht = 'Nein' AND FK_firma_id = 2
-)
-AND
-(
-( '' != '' AND firma LIKE CONCAT('%', '', '%')  )
-OR
-(  vorname LIKE CONCAT('%', 'Vorname1', '%') AND
-nachname LIKE CONCAT('%', '1Nachname', '%') AND 'Vorname1' != '' AND
-'xxxx' != '')
-)
-)
-;
-kunde_id	FK_firma_id	aktuell	vorname	nachname	geloescht
-SELECT COUNT(*) FROM t1 WHERE 
-( 0 OR (vorname LIKE '%Vorname1%' AND nachname LIKE '%1Nachname%' AND 1)) 
-AND FK_firma_id = 2;
-COUNT(*)
-0
-drop table t1;
 CREATE TABLE t1 (a INT, b INT);
 (SELECT a, b AS c FROM t1) ORDER BY c+1;
 a	c
@@ -2717,7 +2663,6 @@ a	c
 SELECT a, b AS c FROM t1 ORDER BY b+1;
 a	c
 drop table t1;
-DROP TABLE IF EXISTS t1, t2;
 CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
 INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
 CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index 938518fcb14..56fab52729e 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -2213,7 +2213,6 @@ drop table t1;
 # Bug #3874 (function in GROUP and LEFT JOIN)
 #
 
-DROP TABLE IF EXISTS t1, t2;
 CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
 INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
 CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );

From c8067ec8489dfc1ee96ba89100a9ef067578ffca Mon Sep 17 00:00:00 2001
From: unknown <monty@mysql.com>
Date: Thu, 13 Oct 2005 19:24:01 +0300
Subject: [PATCH 4/4] Fixes during review of new code

sql/slave.cc:
  Moved mutex_unlock to handle 'err' case properly
vio/vio.c:
  Made code clearer (fcntl_mode is always 0 here)
---
 sql/slave.cc | 5 +++--
 vio/vio.c    | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/sql/slave.cc b/sql/slave.cc
index ebae8461f11..2fc4eef0f64 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -4330,7 +4330,8 @@ Before assert, my_b_tell(cur_log)=%s  rli->event_relay_log_pos=%s",
         time_t save_timestamp= rli->last_master_timestamp;
         rli->last_master_timestamp= 0;
 
-	DBUG_ASSERT(rli->relay_log.get_open_count() == rli->cur_log_old_open_count);
+	DBUG_ASSERT(rli->relay_log.get_open_count() ==
+                    rli->cur_log_old_open_count);
 
         if (rli->ign_master_log_name_end[0])
         {
@@ -4341,13 +4342,13 @@ Before assert, my_b_tell(cur_log)=%s  rli->event_relay_log_pos=%s",
                                    Rotate_log_event::DUP_NAME |
                                    Rotate_log_event::ZERO_LEN);
           rli->ign_master_log_name_end[0]= 0;
+          pthread_mutex_unlock(log_lock);
           if (unlikely(!ev))
           {
             errmsg= "Slave SQL thread failed to create a Rotate event "
               "(out of memory?), SHOW SLAVE STATUS may be inaccurate";
             goto err;
           }
-          pthread_mutex_unlock(log_lock);
           ev->server_id= 0; // don't be ignored by slave SQL thread
           DBUG_RETURN(ev);
         }
diff --git a/vio/vio.c b/vio/vio.c
index f60a53d2f04..427c52e29d3 100644
--- a/vio/vio.c
+++ b/vio/vio.c
@@ -146,7 +146,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
       reports that the socket is set for non-blocking when it really will
       block.
     */
-    fcntl(sd, F_SETFL, vio->fcntl_mode);
+    fcntl(sd, F_SETFL, 0);
     vio->fcntl_mode= fcntl(sd, F_GETFL);
 #elif defined(HAVE_SYS_IOCTL_H)			/* hpux */
     /* Non blocking sockets doesn't work good on HPUX 11.0 */