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 */